Introduction

This report provides an overview of the Armed Conflict Location and Event Data Project (ACLED) dataset for Myanmar. This dataset contains information on conflict actors, conflict events, event types, event locations and fatalities dating back to 2010; the data is updated on a monthly basis. With some notable exceptions, this report is largely focused on 2021 data.

The aim of ACLED is “to capture the forms, agents, dates and locations of political violence and protests”; its methodology for Myanmar consists of the review of English and Myanmar sources to code political violence and demonstration events: the vast majority (85%) of their information originates from subnational, national and international media sources, with the remainder originating from ACLED’s partnership with the Myanmar Peace Monitor and reports by the UN, international monitoring groups and local human rights organisations. Points of alignment and divergence from the conflict events collected by the Nexus Response Mechanism’s Conflict Analysis and Research Facility remains to be explored.

The terminology employed with this report follows what has been laid out in the ACLED codebook; the review of the codebook, as well as ACLED’s methodology notes on Myanmar, is highly encouraged. This report would like to highlight the excellent scholarship of the Armed Conflict Location and Event Data Project, as well as their dedication in making this wealth of data public. This report also echoes ACLED’s calls for increased protections for journalists and independent reporting.


References for this report




1. Progression of conflict events by interaction type in 2021

The GIF below shows 2021 conflict events by month. The colour of each point indicates the interaction type – the 6 most common interaction types have been included and less frequent types have been recoded as “Other” – and the number of fatalities associated with each event is indicated by the size of each point.





2. Distribution of food security partners and conflict events in 2021

There is, in general, a dearth of partners in the parts of the country most affected by conflict. Battles and explosions and remote violence were most prevalent in Sagaing, and, to lesser extents Kachin and Shan North.





3. Summaries by event type

3.1 Annual distribution of conflict events and fatalities

The plot below shows a massive spike in conflict events in 2021, bearing in mind that Myanmar has long been embroiled in a 70-year civil war.


The 2021 breakdown of conflict events in 2021 was:

2021 event types by percentage of total
event_type count percentage
Protests 5,973 36.73
Strategic developments 3,262 20.06
Explosions/Remote violence 2,734 16.81
Battles 2,296 14.12
Violence against civilians 1,891 11.63
Riots 107 0.66
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


There were more conflict fatalities in 2021 than from 2010 to 2020 combined. There were more fatalities related to violence against civilians alone than all conflict-related fatalities in 2019, which previously had the highest number of fatalities this decade.



For reference, the 2021 breakdown of fatalities by event type was:

2021 conflict fatalities by event type
event_type fatalities percentage
Battles 6,540 56.84
Explosions/Remote violence 2,590 22.51
Violence against civilians 1,729 15.03
Protests 375 3.26
Riots 252 2.19
Strategic developments 20 0.17
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.2 Monthly progression of conflict events and fatalities in 2021

Battles, explosions and remote violence and strategic developments rose steadily until May 2021, then experienced a brief decline before rising again in September 2021. Protests and riots peaked in March 2021, right after the coup. Events involving violence against civilians grew in frequency throughout the year, though a slight decline in intensity was noted at the end of the year.




3.3 Geographic distribution of conflict events


Sagaing saw the highest number of conflict events as well as fatalities in 2021, in particular, it experienced more than three times as many conflict-related fatalities than the next highest region, Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.





4. Conflict actors

4.1 Conflict events by type of actor

The next two sections summarise conflict events and fatalities by event type and actor type. For the plots below, one should bear in mind that most event types (with the exception of peaceful protests) involved more than one actor, so totalling up each facet will result in a number higher than the total number of events. For instance, the same battle involving state forces and rebel groups would show up in the event counts of each.



2021 number of conflict events by actor type
actor_type state_forces protesters civilians political_militias rebel_groups rioters identity_militias external_other_force
events 7,938 6,021 4,850 4,585 1,585 116 3 5
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.2 Fatalities by actor type

The plot below on fatalities shows the number of fatalities associated with each type of actor. It should be noted that the ACLED dataset does not have a column to assign blame, neither are the specific details of the fatalities always known – there is additional information in the column notes and text mining would be a fruitful next step for future analysis, but has not been performed for this cursory overview of the data. And similar to the plot on event types above, duplications have been included, though not within the totals for each actor type.

For instance, under fatalities related to protests, 381 fatalities were associated with protesters, with the main other party involved almost entirely being state forces, with very small numbers being associated with rioters.



2021 number of fatalities associated with each actor type
actor_type state_forces protesters civilians political_militias rebel_groups rioters identity_militias external_other_force
fatalities 9,983 373 1,871 7,363 2,184 260 3 0
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.3 Which actors are associated with the most fatalities?

As mentioned, it is difficult at this juncture to state how many of the associated fatalities were persons killed by these groups and how many were members of these groups had been the ones who were killed. Still, it is worthwhile to plot which actors are the “bloodiest”, at least in regards to the outcomes of their actions, or have been involved in incidents with the most fatalities.

The plot below seeks to examine which actors have been associated with the most fatalities per event, and only actors which have participated in more than 50 conflict events have been included. The point shows the average number of fatalities associated with each actor per conflict event it was involved in. The whiskers show the upper and lower ranges of fatalities per event, that is, 95% of all conflict events that an actor participated in fell within that range. The highest numbers of fatalities per event are associated with political militias and rebel groups.



The table below summarises the number of fatalities and conflict events associated with the largest actors. The table has been sorted in descending order of number of fatalities; only actors associated with more than 100 fatalities are shown and all other actors have been lumped together as “Other”.

Top 2021 actors in terms of fatalities; actors associated with less than 100 fatalities have been lumped together as ‘Other’
actor actor_type fatalities events fatalities_per_event
Military Forces of Myanmar state_forces 9,540 6,993 1.36
People’s Defense Force political_militias 3,335 1,110 3.00
Civilians (Myanmar) civilians 1,871 4,844 0.39
Other 1,420 1,239 1.15
Unidentified Armed Group (Myanmar) political_militias 934 2,299 0.41
KIO/KIA rebel_groups 758 668 1.13
KNU/KNLA rebel_groups 713 251 2.84
CDF political_militias 657 161 4.08
Protesters (Myanmar) protesters 373 6,021 0.06
Police Forces of Myanmar state_forces 359 779 0.46
MNTJP/MNDAA rebel_groups 328 157 2.09
YDF political_militias 297 31 9.58
Unidentified Local Defense Forces (Myanmar) political_militias 276 101 2.73
Rioters (Myanmar) rioters 260 116 2.24
KNDF political_militias 214 57 3.75
PPDF political_militias 203 34 5.97
KNPP/KA rebel_groups 197 72 2.74
PRA political_militias 168 28 6.00
Pyu Saw Htee political_militias 134 142 0.94
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.4 Summary table of main conflict actors

Top 5 conflict actors in 2021 by actor type
actor_type actor_name events %_of_group
state_forces
state_forces Military Forces of Myanmar 6,993 88.10
state_forces Police Forces of Myanmar 779 9.81
state_forces Government of Myanmar (2021-) 67 0.84
state_forces Military Forces of Myanmar - Border Guard Force 43 0.54
state_forces People’s Militia Force 43 0.54
protesters
protesters Protesters (Myanmar) 6,021 100.00
civilians
civilians Civilians (Myanmar) 4,844 99.88
civilians Civilians (Australia) 2 0.04
civilians Civilians (China) 1 0.02
civilians Civilians (International) 1 0.02
civilians Civilians (Japan) 1 0.02
civilians Civilians (United States) 1 0.02
political_militias
political_militias Unidentified Armed Group (Myanmar) 2,299 50.14
political_militias People’s Defense Force 1,110 24.21
political_militias CDF: Chinland Defense Force 161 3.51
political_militias Pyu Saw Htee 142 3.10
political_militias Unidentified Local Defense Forces (Myanmar) 101 2.20
rebel_groups
rebel_groups KIO/KIA: Kachin Independence Organization/Kachin Independence Army 668 42.15
rebel_groups KNU/KNLA: Karen National Union/Karen National Liberation Army 251 15.84
rebel_groups RCSS/SSA-S: Restoration Council of Shan State/Shan State Army-South 168 10.60
rebel_groups MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 157 9.91
rebel_groups PSLF/TNLA: Palaung State Liberation Front/Ta’ang National Liberation Army 123 7.76
rioters
rioters Rioters (Myanmar) 116 100.00
identity_militias
identity_militias Unidentified Communal Militia (Myanmar) 3 100.00
external_other_force
external_other_force Private Security Forces (Myanmar) 4 80.00
external_other_force ASEAN: Association of Southeast Asian Nations 1 20.00
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.5 Geographic distribution of conflict actors




5. Correlations between conflict and food security cluster footprint

5.1 Correlation plot

The correlation plot below examines the specific relationships between the individual variables in the dataset – the histograms down the diagonal show the distributions of townships across the various values; the correlations between variables (all between 0 and 1) are shown in the upper triangle, with the asterisks denoting how significant the correlations are; and the lower triangle shows the specific distribution of observations, with each point representing each township. Beneficiaries have been placed on a logarithmic scale so that the variation is more visible.

For instance, violence against civilians is highly correlated with strategic developments (with a coefficient of 0.79) – this means that in the townships where strategic developments occurred (the most common strategic developments were arrests and looting/property damage), violence against civilians also likely occurred.



The numbers of partners and beneficiaries per township were, unsurprisingly, correlated with each other. However, the number of partners per townships was only slightly correlated with the number of battles and the number of explosions and remote violence – this pattern likely only holds for certain states. The number of beneficiaries reached is not correlated with any conflict indicators.

The various conflict indicators – as expected – are highly correlated with each other, with the strongest relationship being between violence against civilians and strategic developments. For reference, the specific sub-events under strategic developments are listed below:

Sub-event types under strategic developments, 2021
sub_event_type count percentage
Arrests 1,601 49.08
Looting/property destruction 685 21.00
Change to group/activity 481 14.75
Other 339 10.39
Disrupted weapons use 85 2.61
Headquarters or base established 66 2.02
Agreement 4 0.12
Non-violent transfer of territory 1 0.03
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.2 Revisiting the MIMU-HARP conflict index

A conflict score was then calculated using ACLED data: its construction was similar to the conflict index in the MIMU-HARP Vulnerability Analysis, with the notable omission of data on displacement – this has been requested and the score will be updated once that data has been made available.

The conflict score – at its most basic level – is an average of the normalised values of battles, explosions and remote violence, violence against civilians, strategic developments, non-peaceful protests and riots and the conflict-related fatalities. However, these normalised values have be re-weighted with the Betti-Verma method, which penalises redundancy and rewards variation; this is the other notable divergence from MIMU-HARP’s methodology. The Betti-Verma method was employed through the mdepriv R package developed by Atillio Benini and Aldo Benini.

Below is a plot of townships comparing the conflict score with the number of beneficiaries.



As expected, from reviewing the correlation plot above and from the flat blue line, the incidence of conflict (represented by the conflict score, where higher values indicate higher incidence of conflict) has no discernible relationship – positive or negative – with the number of FSC beneficiaries. The blue line just shows a simple linear model, the summary of which is printed below:


  Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.102 0.01493 6.831 0.0000000002926
beneficiaries 0.00000005841 0.0000001266 0.4612 0.6454
partners -0.001092 0.00547 -0.1997 0.8421
Summary of linear model
Observations Residual Std. Error \(R^2\) Adjusted \(R^2\)
133 0.112 0.001634 -0.01373



5.3 Township-level distributions of conflict events and fatalities

These two histograms shows the distribution of conflict events and fatalities per township. Additional analysis will be performed at a later date. However, townships with more than 100 conflict events should be considered priorities for humanitarian action. More detailed information can be obtained from the reference table in chapter 8.



Similar to the plot above on conflict events, there are some very clear outliers in terms of fatalities. It would also be important to establish thresholds (with the conflict score or any of its constituent components) and target heavily-affected areas for humanitarian intervention – at least, all townships with more than 100 conflict fatalities should be prioritised.





6. Text mining the ACLED dataset

6.1 Network graph of correlated words

This chapter focuses on data mining the text within the column notes of the ACLED dataset, which contains the descriptions of each conflict events. For this first section, it is of interest to the FSC to visualise all the relationships amongst word simultaneously and have arranged these words into a network graph. Below, each word from the conflict description is a node and the opacity of the line denotes the strength of its correlation to other words (that is, the probability that they have been used to describe the same conflict event):


conflict network graph click here to see the full-sized graph.


Several interesting clusters are noticed: the first of which clusters around protests and is linked to words such as coup and disobedience, below it is another closely related cluster containing the words live, rubber, bullets, disperse and crowd. It can be fairly easily surmised that these words are related to conflict events surrounding the February 2021 coup and the mass demonstrations in response to it – the word February is also closely linked with these clusters.

Another cluster of note centres around the words remote, controlled and explosives, and is closely linked to the words convoy, trucks and landmines — these words are likely linked to events where military convoys were bombed and ambushed by People’s Defence Forces.

There is also the Kachin cluster, centred around Myitkyina, Waingmaw, Monhyin, Hpakant, Bhamo and the KIA, the Kachin Independence Army. Noticeably, this cluster also has links with the words battalion and jet and fighters.

This network graph is not intended to be an exhaustive record of the conflict events in 2021 and merely intends to provide an overview: indeed, only words which appeared more than 70 times in the ACLED dataset and had a correlation of 0.2 or more were included. These thresholds were chosen to improve the readability of the graph, but the inclusion of words with too few occurrences might also to spurious correlations. Click on the link to see the graph at full-size and explore it further.



6.2 Pairwise correlations

To complement the network graph above, the table below shows correlations between individual words in the ACLED dataset conflict descriptions – this is especially useful if there is a word of interest that the reader would like to explore in further detail. To reduce the size of table loaded, only words which have appeared more than 50 times in 2021 and only the top 20 matches per word have been included. A correlation of 1 means that the word always appears with its match in the dataset; a correlation of 0.5 means that the word appears in the same event as its match 50% of the time.

Use the filter above the column word to try out different words – try starting with “artillery”, “protest”, “landmine” or a location of interest. All words are in lower case. The search bar will look in both columns and may prove less useful than the filter bar.




6.3 Sources used by the ACLED dataset

As mentioned, these words originate from the ACLED dataset’s descriptions of each conflict event. In the vast majority of cases, these conflict descriptions are articles from various news sources.

A total of 67 news sources were used in the ACLED dataset. About a third of the conflict events in 2021 included in the ACLED dataset were originally reported in the Democratic Voice of Burma. To assess the completeness and reliability of the ACLED dataset, a more thorough analysis of the news sources it makes use of should be conducted. Additionally, comparisons should be made between ACLED’s methodology and that of the Nexus Response Mechanism. The most common news sources are listed in the plot below, in order of the share of 2021 conflict events attributed to them.





7. Next steps

  • Re-calculate the conflict score once IDP data is obtained and compare these results to previous results recorded by MIMU-HARP in their vulnerability analysis. To note, displacement is likely to be highly correlated with the other conflict indicators (this was the case with the MIMU-HARP conflict index). Nevertheless, it was a key component of the MIMU-HARP model and its inclusion will aid in improving comparability.

  • Compare the conflict score and specific conflict indicators to results of the WFP-FAO food insecurity survey. It is important to understand if there are any significant correlations between the two. Filter the conflict data to only include time periods relevant to WFP-FAO’s study. Additionally, conflict scores should be cross-referenced with market prices to see if a predictive model can be established. Additionally, begin the comparison of conflict data and data on malnutrition. There will likely be many challenges in obtaining accurate mortality rates of any kind.

  • Compare conflict indicators to market prices to identify if battles and other violent incidents have had impacts on food prices and their stability; explore if a predictive model can be developed.

  • Review findings with other humanitarian stakeholders; develop area-specific products, if necessary. It is important to review the conflict score with other stakeholders to assess appetite for its adoption. Most of the data used for its generation is easily accessible and regularly updated, though it remains to be seen to what extent this is true for the data on displacement.

  • Compare ACLED data against MIMU’s hard-to-reach areas dataset.

  • Cross-reference conflict data with partner presence and achievements of other clusters.




8. Reference maps and tables

8.1 Reference table of 2021 conflict events aggregated at township level



8.2 Reference table by conflict actors in 2021



8.3 Reference maps

LS0tDQp0aXRsZTogIkV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgb2YgY29uZmxpY3QgZGF0YSBhbmQgZm9vZCBzZWN1cml0eSBjbHVzdGVyIHByZXNlbmNlIGFuZCBhY2hpZXZlbWVudHMiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIxMS8wMi8yMDIyIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlICAgDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCiMjIEludHJvZHVjdGlvbg0KDQpUaGlzIHJlcG9ydCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpIGRhdGFzZXQgZm9yIE15YW5tYXIuIFRoaXMgZGF0YXNldCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjb25mbGljdCBhY3RvcnMsIGNvbmZsaWN0IGV2ZW50cywgZXZlbnQgdHlwZXMsIGV2ZW50IGxvY2F0aW9ucyBhbmQgZmF0YWxpdGllcyBkYXRpbmcgYmFjayB0byAyMDEwOyB0aGUgZGF0YSBpcyB1cGRhdGVkIG9uIGEgbW9udGhseSBiYXNpcy4gV2l0aCBzb21lIG5vdGFibGUgZXhjZXB0aW9ucywgdGhpcyByZXBvcnQgaXMgbGFyZ2VseSBmb2N1c2VkIG9uIDIwMjEgZGF0YS4gDQoNClRoZSBhaW0gb2YgQUNMRUQgaXMgInRvIGNhcHR1cmUgdGhlIGZvcm1zLCBhZ2VudHMsIGRhdGVzIGFuZCBsb2NhdGlvbnMgb2YgcG9saXRpY2FsIHZpb2xlbmNlIGFuZCBwcm90ZXN0cyI7IGl0cyBtZXRob2RvbG9neSBmb3IgTXlhbm1hciBjb25zaXN0cyBvZiB0aGUgcmV2aWV3IG9mIEVuZ2xpc2ggYW5kIE15YW5tYXIgc291cmNlcyB0byBjb2RlIHBvbGl0aWNhbCB2aW9sZW5jZSBhbmQgZGVtb25zdHJhdGlvbiBldmVudHM6IHRoZSB2YXN0IG1ham9yaXR5ICg4NSUpIG9mIHRoZWlyIGluZm9ybWF0aW9uIG9yaWdpbmF0ZXMgZnJvbSBzdWJuYXRpb25hbCwgbmF0aW9uYWwgYW5kIGludGVybmF0aW9uYWwgbWVkaWEgc291cmNlcywgd2l0aCB0aGUgcmVtYWluZGVyIG9yaWdpbmF0aW5nIGZyb20gQUNMRUQncyBwYXJ0bmVyc2hpcCB3aXRoIHRoZSBNeWFubWFyIFBlYWNlIE1vbml0b3IgYW5kIHJlcG9ydHMgYnkgdGhlIFVOLCBpbnRlcm5hdGlvbmFsIG1vbml0b3JpbmcgZ3JvdXBzIGFuZCBsb2NhbCBodW1hbiByaWdodHMgb3JnYW5pc2F0aW9ucy4gUG9pbnRzIG9mIGFsaWdubWVudCBhbmQgZGl2ZXJnZW5jZSBmcm9tIHRoZSBjb25mbGljdCBldmVudHMgY29sbGVjdGVkIGJ5IHRoZSBOZXh1cyBSZXNwb25zZSBNZWNoYW5pc20ncyBDb25mbGljdCBBbmFseXNpcyBhbmQgUmVzZWFyY2ggRmFjaWxpdHkgcmVtYWlucyB0byBiZSBleHBsb3JlZC4NCg0KVGhlIHRlcm1pbm9sb2d5IGVtcGxveWVkIHdpdGggdGhpcyByZXBvcnQgZm9sbG93cyB3aGF0IGhhcyBiZWVuIGxhaWQgb3V0IGluIHRoZSBBQ0xFRCBjb2RlYm9vazsgdGhlIHJldmlldyBvZiB0aGUgY29kZWJvb2ssIGFzIHdlbGwgYXMgQUNMRUQncyBtZXRob2RvbG9neSBub3RlcyBvbiBNeWFubWFyLCBpcyBoaWdobHkgZW5jb3VyYWdlZC4gVGhpcyByZXBvcnQgd291bGQgbGlrZSB0byBoaWdobGlnaHQgdGhlIGV4Y2VsbGVudCBzY2hvbGFyc2hpcCBvZiB0aGUgQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGEgUHJvamVjdCwgYXMgd2VsbCBhcyB0aGVpciBkZWRpY2F0aW9uIGluIG1ha2luZyB0aGlzIHdlYWx0aCBvZiBkYXRhIHB1YmxpYy4gVGhpcyByZXBvcnQgYWxzbyBlY2hvZXMgQUNMRUQncyBjYWxscyBmb3IgaW5jcmVhc2VkIHByb3RlY3Rpb25zIGZvciBqb3VybmFsaXN0cyBhbmQgaW5kZXBlbmRlbnQgcmVwb3J0aW5nLg0KDQo8YnI+DQoNCiMjIyBSZWZlcmVuY2VzIGZvciB0aGlzIHJlcG9ydA0KKiBBQ0xFRCwgKDIwMTkpLiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpIENvZGVib29rLiBodHRwczovL3d3dy5hY2xlZGRhdGEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9kbG1fdXBsb2Fkcy8yMDE3LzEwL0FDTEVEX0NvZGVib29rXzIwMTlGSU5BTF9wYmwucGRmDQoqIEFDTEVELCAoMjAyMikuIEFDTEVEIGRhdGEgZm9yIE15YW5tYXIgKDIwMTAtMjAyMikuIGh0dHBzOi8vYWNsZWRkYXRhLmNvbQ0KKiBBQ0xFRCwgKDIwMjApLiBBQ0xFRCBNZXRob2RvbG9neSBhbmQgQ29kaW5nIERlY2lzaW9ucyBhcm91bmQgUG9saXRpY2FsIFZpb2xlbmNlIGluIE15YW5tYXIuIGh0dHBzOi8vYWNsZWRkYXRhLmNvbS9hY2xlZGRhdGFuZXcvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMTEvQUNMRURfUG9saXRpY2FsLVZpb2xlbmNlLWluLU15YW5tYXJfRmVicnVhcnktMjAyMC5wZGYNCiogQXRpbGxpbyBCZW5pbmksIEFsZG8gQmVuaW5pICgyMDIxKS4gbWRlcHJpdjogU3ludGhldGljIHNjb3JlcyBvZiBtdWx0aXBsZSBkZXByaXZhdGlvbi4gUiBwYWNrYWdlIHZlcnNpb24gMC4wLjMuICBodHRwczovL2dpdGh1Yi5jb20vYS1iZW5pbmkvbWRlcHJpdi8NCiogRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBNeWFubWFyICgyMDIxKS4gNVdzIHJlcG9ydGluZyB0b29sLiANCg0KPGJyPjxicj48YnI+DQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KGZ1enp5am9pbikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHMyKQ0KbGlicmFyeShib29rZG93bikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZ2dzZmxhYmVsKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHdpZHlyKQ0KbGlicmFyeShnZ2FuaW1hdGUpDQpsaWJyYXJ5KGdpZnNraSkNCmxpYnJhcnkocG5nKQ0KbGlicmFyeSh0cmFuc2Zvcm1yKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoeHRhYmxlKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkodGlkeXRleHQpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGN1bXVhbHRpdmUgY291bnQNCmN1bWNvdW50IDwtIGZ1bmN0aW9uKHgpew0KICBjdW1jb3VudCA8LSBudW1lcmljKGxlbmd0aCh4KSkNCiAgbmFtZXMoY3VtY291bnQpIDwtIHgNCg0KICBmb3IoaSBpbiAxOmxlbmd0aCh4KSl7DQogICAgY3VtY291bnRbaV0gPC0gc3VtKHhbMTppXT09eFtpXSkNCiAgfQ0KDQogIHJldHVybihjdW1jb3VudCkNCn0NCg0KIyByZWFkaW5nIGluIHRvd25zaGlwcyBmcm9tIGdlb2FkbWlucyANCnRvd25zaGlwcyA8LSByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KGFkbWluMXBjb2RlXzQ6YWRtaW4zcGNvZGUpICU+JSANCiAgcmVuYW1lKGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzQsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZSwNCiAgICAgICAgIHN0YXRlX25hbWUgICA9IHN0YXRlXzUsDQogICAgICAgICB0b3duc2hpcF9uYW1lICA9IGNvdW50eSkgJT4lIA0KICByZW1vdmVfZW1wdHkoKQ0KDQojIHJlYWRpbmcgaW4gYWNsZWQNCmFjbGVkIDwtIHJlYWRfZXhjZWwoIjIwMTAtMDEtMDEtMjAyMi0wMS0yNS1NeWFubWFyLnhsc3giLCANCiAgICAgICAgIHNoZWV0ID0gIjIwMTAtMjAyMS1DbGVhbmVkIikgJT4lIA0KICBtdXRhdGUoYWRtaW4zID0gcmVjb2RlKGFkbWluMywNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LVNvdXRoIiA9ICJEYWdvbiBNeW90aGl0IChTb3V0aCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtTm9ydGgiID0gIkRhZ29uIE15b3RoaXQgKE5vcnRoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1TZWlra2FuIiA9ICJEYWdvbiBNeW90aGl0IChTZWlra2FuKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1FYXN0IiA9ICJEYWdvbiBNeW90aGl0IChFYXN0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSGxhaW5ndGhhcnlhLUVhc3QiID0gIkhsYWluZ3RoYXJ5YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSGxhaW5ndGhhcnlhLVdlc3QiID0gIkhsYWluZ3RoYXJ5YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUGFuZ3NhbmciID0gIlBhbmdzYW5nIChQYW5naGthbSkiKSkgJT4lIA0KICAjIGxvY2F0aW9ucyBpbiB5YW5nb24gd2l0aCBsb25nbGF0LCBidXQgbm8gYWRtaW4zIGhhdmUgYmVlbiBjb2RlZCBhcyBLeWF1a3RhZGEsIHdoZXJlIGNpdHkgaGFsbCBpczsNCiAgIyBzaW1pbGFybHksIGluIG1hbmRhbGF5LCB0aGV5IGhhdmUgYmVlbiBwbGFjZWQgaW4gQ2hhbmF5ZXRoYXphbiBhbmQgWmF5IHlhciB0aGkgcmkgaW4gTlBUDQogIG11dGF0ZShhZG1pbjMgPSBjYXNlX3doZW4oaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDE2LjgwNTIgfiAiS3lhdWt0YWRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAxOS43NDUwIH4gIlpheSBZYXIgVGhpIFJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAyMS45NzQ3IH4gIkNoYW5heWV0aGF6YW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGFkbWluMykpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgIA0KICAgICAgICAgICAgICBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSBjKCJhZG1pbjMiID0gInRvd25zaGlwX25hbWUiKSkgJT4lIA0KICBncm91cF9ieShkYXRhX2lkKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1pbihldmVudF9pZF9ub19jbnR5KSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShpbnRlcl90eXBlID0gaW50ZXJhY3Rpb24sDQogICAgICAgICBpbnRlcl90eXBlID0gcmVjb2RlX2ZhY3RvcihpbnRlcl90eXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTBgID0gIlNPTEUJTUlMSVRBUlkgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDExYCA9ICJNSUxJVEFSWSBWRVJTVVMgTUlMSVRBUlkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTJgID0gIk1JTElUQVJZIFZFUlNVUyBSRUJFTFMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTNgID0gIk1JTElUQVJZIFZFUlNVUyBQT0xJVElDQUwgTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxNGAgPSAiTUlMSVRBUlkgVkVSU1VTIENPTU1VTkFMIE1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTVgID0gIk1JTElUQVJZIFZFUlNVUyBSSU9URVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDE2YCA9ICJNSUxJVEFSWSBWRVJTVVMgUFJPVEVTVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxN2AgPSAiTUlMSVRBUlkgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxOGAgPSAiTUlMSVRBUlkgVkVSU1VTIE9USEVSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIwYCA9ICJTT0xFIFJFQkVMIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMmAgPSAiUkVCRUxTIFZFUlNVUyBSRUJFTFMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjNgID0gIlJFQkVMUwlWRVJTVVMgUE9MSVRJQ0FMIE1JTElJVEEgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDI0YCA9ICJSRUJFTFMgVkVSU1VTIENPTU1VTkFMIE1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjVgID0gIlJFQkVMUyBWRVJTVVMgUklPVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyNmAgPSAiUkVCRUxTIFZFUlNVUyBQUk9URVNURVJTICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyN2AgPSAiUkVCRUxTIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjhgID0gIlJFQkVMUyBWRVJTVVMgT1RIRVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDMwYCA9ICJTT0xFIFBPTElUSUNBTCBNSUxJVElBIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzM2AgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIFBPTElUSUNBTAlNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDM0YCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgQ09NTVVOQUwJTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzNWAgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIFJJT1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzZgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBQUk9URVNURVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDM3YCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDM4YCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgT1RIRVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQwYCA9ICJTT0xFIENPTU1VTkFMIE1JTElUSUEgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQ0YCA9ICJDT01NVU5BTCBNSUxJVElBIFZFUlNVUyBDT01NVU5BTCBNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQ1YCA9ICJDT01NVU5BTCBNSUxJVElBIFZFUlNVUyBSSU9URVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQ2YCA9ICJDT01NVU5BTAlNSUxJVElBCVZFUlNVUyBQUk9URVNURVJTICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0N2AgPSAiQ09NTVVOQUwgTUlMSVRJQSBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDQ4YCA9ICJDT01NVU5BTCBNSUxJVElBIFZFUlNVUyBPVEhFUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1MGAgPSAiU09MRSBSSU9URVIgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDU1YCA9ICJSSU9URVJTIFZFUlNVUyBSSU9URVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDU2YCA9ICJSSU9URVJTIFZFUlNVUyBQUk9URVNURVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDU3YCA9ICJSSU9URVJTIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNThgID0gIlJJT1RFUlMgVkVSU1VTIE9USEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2MGAgPSAiU09MRSBQUk9URVNURVIgQUNUSU9OIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDY2YCA9ICJQUk9URVNURVJTIFZFUlNVUyBQUk9URVNURVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDY3YCA9ICJQUk9URVNURVJTIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNjhgID0gIlBST1RFU1RFUlMgVkVSU1VTIE9USEVSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDc4YCA9ICJPVEhFUiBBQ1RPUiBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDgwYCA9ICJTT0xFIE9USEVSIEFDVElPTiIpLCANCiAgICAgICAgIGludGVyX3R5cGUgPSB0b2xvd2VyKHN0cl90cmltKHN0cl9yZXBsYWNlX2FsbChpbnRlcl90eXBlLCAiW1xcclxcblxcdF0rIiwgIiAiKSkpKSAlPiUgDQogIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2UoYWRtaW4zX3Bjb2RlID09ICJNTVIwMDcwMTQiICYgYWRtaW4xID09ICJZYW5nb24iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGlmZWxzZShhZG1pbjEgPT0gIk1hZ3dheSIgJiBhZG1pbjMgPT0gIk1pbmhsYSIsICJNTVIwMDkwMTMiLCBhZG1pbjNfcGNvZGUpKSAlPiUgDQogIG11dGF0ZShoYXNfZmF0YWxpdGllcyA9IGlmZWxzZShmYXRhbGl0aWVzID4gMCwgVFJVRSwgRkFMU0UpKQ0KDQojIGFjdG9yLWxldmVsIGRhdGFzZXQNCmFjdG9ycyA8LSByZWFkX2NzdigiMTkwMC0wMS0wMS0yMDIyLTAyLTA5LU15YW5tYXIuY3N2IikgJT4lIA0KICBtdXRhdGUoYWRtaW4zID0gcmVjb2RlKGFkbWluMywNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LVNvdXRoIiA9ICJEYWdvbiBNeW90aGl0IChTb3V0aCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtTm9ydGgiID0gIkRhZ29uIE15b3RoaXQgKE5vcnRoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1TZWlra2FuIiA9ICJEYWdvbiBNeW90aGl0IChTZWlra2FuKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1FYXN0IiA9ICJEYWdvbiBNeW90aGl0IChFYXN0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSGxhaW5ndGhhcnlhLUVhc3QiID0gIkhsYWluZ3RoYXJ5YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSGxhaW5ndGhhcnlhLVdlc3QiID0gIkhsYWluZ3RoYXJ5YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUGFuZ3NhbmciID0gIlBhbmdzYW5nIChQYW5naGthbSkiKSkgJT4lIA0KICAjIGxvY2F0aW9ucyBpbiB5YW5nb24gd2l0aCBsb25nbGF0LCBidXQgbm8gYWRtaW4zIGhhdmUgYmVlbiBjb2RlZCBhcyBLeWF1a3RhZGEsIHdoZXJlIGNpdHkgaGFsbCBpczsNCiAgIyBzaW1pbGFybHksIGluIG1hbmRhbGF5LCB0aGV5IGhhdmUgYmVlbiBwbGFjZWQgaW4gQ2hhbmF5ZXRoYXphbiBhbmQgWmF5IHlhciB0aGkgcmkgaW4gTlBUDQogIG11dGF0ZShhZG1pbjMgPSBjYXNlX3doZW4oaXMubmEoYWRtaW4zKSAmIGxhdGl0dWRlID09IDE2LjgwNTIgfiAiS3lhdWt0YWRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAxOS43NDUwIH4gIlpheSBZYXIgVGhpIFJpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAyMS45NzQ3IH4gIkNoYW5heWV0aGF6YW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGFkbWluMykpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgIA0KICAgICAgICAgICAgICBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSBjKCJhZG1pbjMiID0gInRvd25zaGlwX25hbWUiKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWNsZWQgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoaW50ZXJhY3Rpb24sIGludGVyX3R5cGUpICU+JSAgZGlzdGluY3QoKSwgYnkgPSAiaW50ZXJhY3Rpb24iKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSBhY3RvcjEpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IA0KICAgICAgICAgICBjYXNlX3doZW4oc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUncyBEZWZlbnNlIEZvcmNlIikgfiAiUGVvcGxlJ3MgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlJvaGluZ3lhIE11c2xpbSBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiUm9oaW5neWEgTXVzbGltIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIldvbWVuIFxcKE15YW5tYXJcXCkiKSB+ICJXb21lbiAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICIyMSBHdWVycmlsbGEgRm9yY2UiKSB+ICIyMSBHdWVycmlsbGEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICIyNyBSZXZvbHV0aW9uIEZvcmNlIikgfiAiMjcgUmV2b2x1dGlvbiBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIjg4IEdlbmVyYXRpb24gUGVhY2UgYW5kIE9wZW4gU29jaWV0eSIpIH4gIjg4IEdlbmVyYXRpb24gUGVhY2UgYW5kIE9wZW4gU29jaWV0eSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkFCRlNVIikgfiAiQUJGU1UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJBaWQgV29ya2VycyBcXChNeWFubWFyXFwpIikgfiAiQWlkIFdvcmtlcnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQXlhZGF3IEJvbmUgTmFpbmcgUERGIikgfiAiQXlhZGF3IEJvbmUgTmFpbmcgUERGIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQmFwdGlzdCBDaHJpc3RpYW4gR3JvdXAiKSB+ICJCYXB0aXN0IENocmlzdGlhbiBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJCdWRkaGlzdCBHcm91cCIpIH4gIkJ1ZGRoaXN0IEdyb3VwIChNeWFubWFyKSIsIA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDREY6IENoaW5sYW5kIERlZmVuc2UgRm9yY2UiKSB+ICJDREY6IENoaW5sYW5kIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDaGluIEV0aG5pYyBHcm91cCIpIH4gIkNoaW4gRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNoaW5lc2UgRXRobmljIEdyb3VwIikgfiAiQ2hpbmVzZSBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ2hyaXN0aWFuIEdyb3VwIil+ICJDaHJpc3RpYW4gR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ2l2aWxpYW5zIFxcKE15YW5tYXJcXCkiKSB+ICJDaXZpbGlhbnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ05PL0NOREYiKSB+ICJDTk8vQ05ERjogQ2hpbiBOYXRpb25hbCBPcmdhbml6YXRpb24vQ2hpbiBOYXRpb25hbCBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiREtCQSBcXChCdWRkaGlzdFxcKSIpIH4gIkRLQkEgKEJ1ZGRoaXN0KTogRGVtb2NyYXRpYyBLYXJlbiBCdWRkaGlzdCBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRmFybWVycyBcXChNeWFubWFyXFwpIikgfiAiRmFybWVycyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJEZW1vY3JhdGljIEd1ZXJyaWxsYSBGb3JjZSIpIH4gIkRlbW9jcmF0aWMgR3VlcnJpbGxhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiREdXQ0YiKSB+ICJER1dDRjogRGVsdGEgR3VlcnJpbGxhIFdhcmZhcmUgQ29sbGVjdGl2ZSBGb3JjZXMiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJGb3JtZXIgR292ZXJubWVudCBvZiBNeWFubWFyIFxcKDIwMTYtXFwpIikgfiAiRm9ybWVyIEdvdmVybm1lbnQgb2YgTXlhbm1hciAoMjAxNi0pIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRm9ybWVyIEdvdmVybm1lbnQgb2YgTXlhbm1hciBcXCgyMDIxLVxcKSIpIH4gIkZvcm1lciBHb3Zlcm5tZW50IG9mIE15YW5tYXIgKDIwMjEtKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkZvcm1lciBNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciBcXCgyMDE2LTIwMjFcXCkiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWVyIE1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyICgyMDE2LTIwMjEpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRm9ybWVyIE1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyIFxcKDIwMjEtXFwpIikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIkZvcm1lciBNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciAoMjAyMS0pIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiR292ZXJubWVudCBvZiBNeWFubWFyIFxcKDIwMTEtMjAxNlxcKSIpIH4gIkdvdmVybm1lbnQgb2YgTXlhbm1hciAoMjAxMS0yMDE2KSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkdvdmVybm1lbnQgb2YgTXlhbm1hciBcXCgyMDE2LVxcKSIpIH4gIkdvdmVybm1lbnQgb2YgTXlhbm1hciAoMjAxNi0pIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiR292ZXJubWVudCBvZiBNeWFubWFyIFxcKDIwMjEtXFwpIikgfiAiR292ZXJubWVudCBvZiBNeWFubWFyICgyMDIxLSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJIZWFsdGggV29ya2VycyBcXChNeWFubWFyXFwpIikgfiAiSGVhbHRoIFdvcmtlcnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiSm91cm5hbGlzdHMgXFwoTXlhbm1hclxcKSIpIH4gIkpvdXJuYWxpc3RzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkthY2hpbiBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIkthY2hpbiBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwgDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIktheWFoIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIil+ICJLYXlhaCBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2F5aW4gRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKX4gIktheWluIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXJlbm5pIERlbW9jcmF0aWMgRnJvbnQiKSB+ICJLREY6IEthcmVubmkgRGVtb2NyYXRpYyBGcm9udCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIktJTy9LSUEiKSB+ICJLSU8vS0lBOiBLYWNoaW4gSW5kZXBlbmRlbmNlIE9yZ2FuaXphdGlvbi9LYWNoaW4gSW5kZXBlbmRlbmNlIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXJlbm5pIE5hdGlvbmFsaXRpZXMgRGVmZW5zZSBGb3JjZSIpIH4gIktOREY6IEthcmVubmkgTmF0aW9uYWxpdGllcyBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2FyZW5uaSBOYXRpb25hbCBQcm9ncmVzc2l2ZSBQYXJ0eSIpIH4gIktOUFAvS0E6IEthcmVubmkgTmF0aW9uYWwgUHJvZ3Jlc3NpdmUgUGFydHkvS2FyZW5uaSBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2FyZW4gTmF0aW9uYWwgVW5pb24iKSB+ICJLTlUvS05MQTogS2FyZW4gTmF0aW9uYWwgVW5pb24vS2FyZW4gTmF0aW9uYWwgTGliZXJhdGlvbiBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS25pZ2h0cyBPZiBUaGUgUmVkIExhbmQiKSB+ICJLT1JMOiBLbmlnaHRzIE9mIFRoZSBSZWQgTGFuZCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIktOVS9LTkxBIFBlYWNlIENvdW5jaWwiKSB+ICJLUEM6IEtOVS9LTkxBIFBlYWNlIENvdW5jaWwiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJMR0JUIFxcKE15YW5tYXJcXCkiKSB+ICJMR0JUIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkxhYm91ciBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiTGFib3VyIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkxpc3UgRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJMaXN1IEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNRzYgR3VlcnJpbGxhIEZvcmNlIikgfiAiTUc2IEd1ZXJyaWxsYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1IRzogTW9ueXdhIEhlcm9lcyBHcm91cCIpIH4gIk1IRzogTW9ueXdhIEhlcm9lcyBHcm91cCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1ISDogTXVuZ3NoYXdhIEhweWVuIEhwdW5nIikgfiAiTUhIOiBNdW5nc2hhd2EgSHB5ZW4gSHB1bmciLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJCb3JkZXIgR3VhcmQgRm9yY2UiKSB+ICJNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciAtIEJvcmRlciBHdWFyZCBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBvbGljZSBGb3JjZXMgb2YgTXlhbm1hciIpIH4gIlBvbGljZSBGb3JjZXMgb2YgTXlhbm1hciIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSdzIE1pbGl0aWEgRm9yY2UiKSB+ICJQZW9wbGUncyBNaWxpdGlhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIiKSB+ICJNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1OVEpQL01OREFBOiBNeWFubWFyIE5hdGlvbmFsIFRydXRoIGFuZCBKdXN0aWNlIFBhcnR5L015YW5tYXIgTmF0aW9uYWwgRGVtb2NyYXRpYyBBbGxpYW5jZSBBcm15IikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIk1OVEpQL01OREFBOiBNeWFubWFyIE5hdGlvbmFsIFRydXRoIGFuZCBKdXN0aWNlIFBhcnR5L015YW5tYXIgTmF0aW9uYWwgRGVtb2NyYXRpYyBBbGxpYW5jZSBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTW9uIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiTW9uIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNb255d2EgTmlnaHRraW5nIikgfiAiTW9ueXdhIE5pZ2h0a2luZyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1vbnl3YSBZb3VuZyBQZW9wbGUgR3JvdXAiKSB+ICJNb255d2EgWW91bmcgUGVvcGxlIEdyb3VwIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTXJvIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiTXJvIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNVEhTRjogTW9uIFRoYXRvbiBTcGVjaWFsIEZvcmNlcyIpIH4gIk1USFNGOiBNb24gVGhhdG9uIFNwZWNpYWwgRm9yY2VzIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTXVzbGltIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJNdXNsaW0gR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTVdWQTogTXlhbm1hciBXYXIgVmV0ZXJhbnMnIEFzc29jaWF0aW9uIikgfiAiTVdWQTogTXlhbm1hciBXYXIgVmV0ZXJhbnMnIEFzc29jaWF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTkxEOiBOYXRpb25hbCBMZWFndWUgZm9yIERlbW9jcmFjeSIpIH4gIk5MRDogTmF0aW9uYWwgTGVhZ3VlIGZvciBEZW1vY3JhY3kiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQYS1PaCBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIlBhLU9oIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQYWxhdW5nL1RhJ2FuZyBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIlBhbGF1bmcvVGEnYW5nIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQYWxlIEpva2VyIFBERiIpIH4gIlBhbGUgSm9rZXJzIFBERiIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSdzIERlZmVuc2UgRnJvY2UiKSB+ICJQZW9wbGUncyBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlIERlZmVuc2UgRnJvY2UiKSB+ICJQZW9wbGUncyBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlJ3MgR3VlcnJpbGxhcyBDb21tYW5kbyIpIH4gIlBlb3BsZSdzIEd1ZXJyaWxsYXMgQ29tbWFuZG8iLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUncyBNaWxpdGlhIEZvcmNlIikgfiAiUGVvcGxlJ3MgTWlsaXRpYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBob2VuaXggRGVmZW5zZSBGb3JjZSIpIH4gIlBob2VuaXggRGVmZW5zZSBGb3JjZSIsIA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQaG9lbml4IFNwZWNpYWwgR3VlcnJpbGxhIEZvcmNlIikgfiAiUGhvZW5peCBTcGVjaWFsIEd1ZXJyaWxsYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBOTy9QTkE6IFBhLU9oIE5hdGlvbmFsIE9yZ2FuaXphdGlvbi9QYS1PaCBOYXRpb25hbCBBcm15IikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIlBOTy9QTkE6IFBhLU9oIE5hdGlvbmFsIE9yZ2FuaXphdGlvbi9QYS1PaCBOYXRpb25hbCBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUHJpc29uZXJzIFxcKE15YW5tYXJcXCkiKSB+ICJQcmlzb25lcnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUFNMRi9UTkxBOiBQYWxhdW5nIFN0YXRlIExpYmVyYXRpb24gRnJvbnQvVGEnYW5nIE5hdGlvbmFsIExpYmVyYXRpb24gQXJteSIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJQU0xGL1ROTEE6IFBhbGF1bmcgU3RhdGUgTGliZXJhdGlvbiBGcm9udC9UYSdhbmcgTmF0aW9uYWwgTGliZXJhdGlvbiBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUmFraGluZSBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIlJha2hpbmUgRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlJDU1MvU1NBLVM6IFJlc3RvcmF0aW9uIENvdW5jaWwgb2YgU2hhbiBTdGF0ZS9TaGFuIFN0YXRlIEFybXktU291dGgiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiUkNTUy9TU0EtUzogUmVzdG9yYXRpb24gQ291bmNpbCBvZiBTaGFuIFN0YXRlL1NoYW4gU3RhdGUgQXJteS1Tb3V0aCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlJlZnVnZWVzL0lEUHMgXFwoTXlhbm1hclxcKSIpIH4gIlJlZnVnZWVzL0lEUHMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiU2hhbiBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIlNoYW4gRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlN0dWRlbnRzIFxcKE15YW5tYXJcXCkiKSB+ICJTdHVkZW50cyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJUZWFjaGVycyBcXChNeWFubWFyXFwpIikgfiAiVGVhY2hlcnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiVUxBL0FBOiBVbml0ZWQgTGVhZ3VlIG9mIEFyYWthbi9BcmFrYW4gQXJteSIpIH4gIlVMQS9BQTogVW5pdGVkIExlYWd1ZSBvZiBBcmFrYW4vQXJha2FuIEFybXkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJVTEZBLUk6IFVuaXRlZCBMaWJlcmF0aW9uIEZyb250IG9mIEFzb20tSW5kZXBlbmRlbnQiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiVUxGQS1JOiBVbml0ZWQgTGliZXJhdGlvbiBGcm9udCBvZiBBc29tLUluZGVwZW5kZW50IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiVXJiYW4gR3VlcnJpbGxhIEdyb3VwIikgfiAiVXJiYW4gR3VlcnJpbGxhIEdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlVTRFA6IFVuaW9uIFNvbGlkYXJpdHkgYW5kIERldmVsb3BtZW50IFBhcnR5IikgfiAiVVNEUDogVW5pb24gU29saWRhcml0eSBhbmQgRGV2ZWxvcG1lbnQgUGFydHkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJaZXJvIEd1ZXJyaWxsYSBGb3JjZSIpIH4gIlplcm8gR3VlcnJpbGxhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRE5QOiBEZW1vY3JhdGljIFBhcnR5IG9mIE5hdGlvbmFsIFBvbGl0aWNzIikgfiAiRE5QOiBEZW1vY3JhdGljIFBhcnR5IG9mIE5hdGlvbmFsIFBvbGl0aWNzIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiSGxhdyBUZXQgSW4gQWhyIFN1IDEyNjogUm93aW5nIEZvcmNlIDEyNiIpIH4gIkhsYXcgVGV0IEluIEFociBTdSAxMjY6IFJvd2luZyBGb3JjZSAxMjYiLA0KICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGFjdG9yX3NpbXBsZSkpICU+JSAgDQogIG11dGF0ZShpbnRlcjEgPSByZWNvZGUoaW50ZXIxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSAic3RhdGVfZm9yY2VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAicmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAicG9saXRpY2FsX21pbGl0aWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiaWRlbnRpdHlfbWlsaXRpYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICJyaW90ZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgNmAgPSAicHJvdGVzdGVycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDdgID0gImNpdmlsaWFucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGA4YCA9ICJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSAlPiUgIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJleHRlcm5hbF9vdGhlcl9mb3JjZSIsICJpZGVudGl0eV9taWxpdGlhcyIsICJyaW90ZXJzIiwgInJlYmVsX2dyb3VwcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2xpdGljYWxfbWlsaXRpYXMiLCAic3RhdGVfZm9yY2VzIiwgImNpdmlsaWFucyIsICJwcm90ZXN0ZXJzIikpKSAlPiUgDQogIG11dGF0ZShldmVudF90eXBlID0gZmN0X3JlbGV2ZWwoZXZlbnRfdHlwZSwgYygiQmF0dGxlcyIsICJFeHBsb3Npb25zL1JlbW90ZSB2aW9sZW5jZSIsICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdGVzdHMiLCAiUmlvdHMiLCAiU3RyYXRlZ2ljIGRldmVsb3BtZW50cyIpKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsIFRSVUUsIEZBTFNFKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkgJT4lIA0KIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RyX2RldGVjdCh0b3duc2hpcCwgIkhsYWluZ3RoYXJ5YSIpLCAiTU1SMDEzMDA4IiwgYWRtaW4zX3Bjb2RlKSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKSAlPiUgc3RfYXNfc2YoKQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoYWRtaW4xcGNvZGVfNDphZG1pbjNwY29kZSkgJT4lIA0KICByZW5hbWUoYWRtaW4xX3Bjb2RlID0gYWRtaW4xcGNvZGVfNCwNCiAgICAgICAgIGFkbWluM19wY29kZSA9IGFkbWluM3Bjb2RlLA0KICAgICAgICAgc3RhdGVfbmFtZSAgID0gc3RhdGVfNSwNCiAgICAgICAgIHRvd25zaGlwX25hbWUgID0gY291bnR5KSAlPiUgDQogIHJlbW92ZV9lbXB0eSgpDQoNCiMgcmVhZGluZyBpbiA1V3MNCmZzYyA8LSByZWFkX2NzdigiZnNjNXdfMjAyMS5jc3YiKQ0KDQojIGFjbGVkIHdvcmRzDQphY2xlZF93b3JkcyA8LSBhY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgc2VsZWN0KGRhdGFfaWQsIG5vdGVzKSAlPiUgDQogIHVubmVzdF90b2tlbnMod29yZCwgbm90ZXMpICU+JSANCiAgYW50aV9qb2luKHN0b3Bfd29yZHMsIGJ5ID0gIndvcmQiKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHdvcmQsICJbYS16XSIpKSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChkYXRhX2lkLCBhZG1pbjNfcGNvZGUsIGV2ZW50X3R5cGUsIGZhdGFsaXRpZXMsIGludGVyX3R5cGUpLCBieSA9ICJkYXRhX2lkIikNCg0KYGBgDQoNCg0KIyMgMS4gUHJvZ3Jlc3Npb24gb2YgY29uZmxpY3QgZXZlbnRzIGJ5IGludGVyYWN0aW9uIHR5cGUgaW4gMjAyMQ0KDQpUaGUgR0lGICBiZWxvdyBzaG93cyAyMDIxIGNvbmZsaWN0IGV2ZW50cyBieSAqKm1vbnRoKiouIFRoZSBjb2xvdXIgb2YgZWFjaCBwb2ludCBpbmRpY2F0ZXMgdGhlIGludGVyYWN0aW9uIHR5cGUgLS0gdGhlIDYgbW9zdCBjb21tb24gaW50ZXJhY3Rpb24gdHlwZXMgaGF2ZSBiZWVuIGluY2x1ZGVkIGFuZCBsZXNzIGZyZXF1ZW50IHR5cGVzIGhhdmUgYmVlbiByZWNvZGVkIGFzICJPdGhlciIgLS0gYW5kIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBldmVudCBpcyBpbmRpY2F0ZWQgYnkgdGhlIHNpemUgb2YgZWFjaCBwb2ludC4gDQoNCjxicj4NCg0KIVtdKGFjbGVkNC5naWYpDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDIuIERpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGFuZCBjb25mbGljdCBldmVudHMgaW4gMjAyMSANCg0KVGhlcmUgaXMsIGluIGdlbmVyYWwsIGEgZGVhcnRoIG9mIHBhcnRuZXJzIGluIHRoZSBwYXJ0cyBvZiB0aGUgY291bnRyeSBtb3N0IGFmZmVjdGVkIGJ5IGNvbmZsaWN0LiBCYXR0bGVzIGFuZCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2Ugd2VyZSBtb3N0IHByZXZhbGVudCBpbiBTYWdhaW5nLCBhbmQsIHRvIGxlc3NlciBleHRlbnRzIEthY2hpbiBhbmQgU2hhbiBOb3J0aC4gDQoNCjxicj4NCg0KYGBge3IgbWFwLWV2ZW50cy1mc2MtcGFybnRlcnMsIGZpZy5oZWlnaHQ9MTB9DQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JQ0KICBmdWxsX2pvaW4oZnNjICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSAgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjFfcGNvZGUsIGFkbWluM19wY29kZSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlKSwgc2l6ZSA9IDAuNSwgYWxwaGEgPSAwLjQsIGNvbG91ciA9ICJyZWQiKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMSwgMywgNiwgOSwgMTIpKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGFuZCBjb25mbGljdCBldmVudHMgaW4gMjAyMSIsDQogICAgICAgc3VidGl0bGUgPSAgIlJlZCBkb3RzIGFyZSBjb25mbGljdCBldmVudHM7IHBlYWNlZnVsIHByb3Rlc3RzIGhhdmUgYmVlbiBleGNsdWRlZCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZXM6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20gYW5kIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIiwNCiAgICAgICBmaWxsID0gIm51bWJlciBvZlxucGFydG5lcnMiKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQogDQogPGJyPjxicj48YnI+DQoNCg0KIyMgMy4gU3VtbWFyaWVzIGJ5IGV2ZW50IHR5cGUNCg0KIyMjIDMuMSBBbm51YWwgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcw0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyBhIG1hc3NpdmUgc3Bpa2UgaW4gY29uZmxpY3QgZXZlbnRzIGluIDIwMjEsIGJlYXJpbmcgaW4gbWluZCB0aGF0IE15YW5tYXIgaGFzIGxvbmcgYmVlbiBlbWJyb2lsZWQgaW4gYSA3MC15ZWFyIGNpdmlsIHdhci4gDQoNCmBgYHtyIGJhcnBsb3QteWVhci1ldmVudHN9DQphY2xlZCAlPiUgDQogIGZpbHRlcighaXMubmEoZXZlbnRfdHlwZSkgJiB5ZWFyIDwgMjAyMikgJT4lDQogIG11dGF0ZSh5ZWFyID0gcm91bmQoeWVhcikpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGdncGxvdChhZXMoeWVhciwgY291bnQsIGZpbGwgPSBldmVudF90eXBlLCBncm91cCA9IGV2ZW50X3R5cGUpKSArIA0KICAjIGdlb21fbGluZShzaXplID0gMSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShzdGF0KHkpLCBhY2N1cmFjeSA9IDEpLCBncm91cCA9IHllYXIpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNywgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDEwLCAyMDIxLCBieSA9IDEpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGxpbWl0cyA9IGMoMCwgMTcwMDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZXZlbnRzIiwNCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgYnkgZXZlbnQgdHlwZSwgMjAxMC0yMDIxIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KVGhlIDIwMjEgYnJlYWtkb3duIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxIHdhczoNCg0KYGBge3IgY29uZmxpY3QtZXZlbnRzLXN1bW1hcnktMjAyMX0NCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSByb3VuZChjb3VudCAvIHN1bShjb3VudCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwZXJjZW50YWdlKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjEgZXZlbnQgdHlwZXMgYnkgcGVyY2VudGFnZSBvZiB0b3RhbCIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNClRoZXJlIHdlcmUgbW9yZSBjb25mbGljdCBmYXRhbGl0aWVzIGluIDIwMjEgdGhhbiBmcm9tIDIwMTAgdG8gMjAyMCBjb21iaW5lZC4gVGhlcmUgd2VyZSBtb3JlIGZhdGFsaXRpZXMgcmVsYXRlZCB0byB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyBhbG9uZSB0aGFuIGFsbCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgaW4gMjAxOSwgd2hpY2ggcHJldmlvdXNseSBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGZhdGFsaXRpZXMgdGhpcyBkZWNhZGUuDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC15ZWFyLWZhdGFsdGllc30NCmFjbGVkICU+JSANCiAgZmlsdGVyKCFpcy5uYShldmVudF90eXBlKSAmIHllYXIgPCAyMDIyKSAlPiUNCiAgbXV0YXRlKHllYXIgPSByb3VuZCh5ZWFyKSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIGZhdGFsaXRpZXMsIGZpbGwgPSBldmVudF90eXBlLCBncm91cCA9IGV2ZW50X3R5cGUpKSArIA0KICAjIGdlb21fbGluZShzaXplID0gMSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShzdGF0KHkpLCBhY2N1cmFjeSA9IDEpLCBncm91cCA9IHllYXIpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNywgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDEwLCAyMDIxLCBieSA9IDEpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGxpbWl0cyA9IGMoMCwgMTI1MDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJGYXRhbGl0aWVzIGJ5IGNvbmZsaWN0IGV2ZW50IHR5cGUsIDIwMTAtMjAyMSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkZvciByZWZlcmVuY2UsIHRoZSAyMDIxIGJyZWFrZG93biBvZiBmYXRhbGl0aWVzIGJ5IGV2ZW50IHR5cGUgd2FzOg0KDQpgYGB7ciBmYXRhbGl0aWVzLXN1bW1hcnktMjAyMX0NCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwZXJjZW50YWdlKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjEgY29uZmxpY3QgZmF0YWxpdGllcyBieSBldmVudCB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgTW9udGhseSBwcm9ncmVzc2lvbiBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgaW4gMjAyMQ0KDQpgYGB7ciBmYWNldC1saW5lLXBsb3QtbW9udGhseX0NCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbHVicmlkYXRlOjptb250aChldmVudF9kYXRlLCBsYWJlbCA9IFRSVUUpKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lDQogIyAgbXV0YXRlKG1vbnRoID0gZmN0X3Jldihtb250aCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBjb3VudCwgZ3JvdXAgPSBldmVudF90eXBlLCBjb2xvdXIgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIGZhY2V0X3dyYXAofmV2ZW50X3R5cGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBldmVudHMiLCANCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgMjAyMSBjb25mbGljdCBldmVudHMgcGVyIG1vbnRoLCBieSB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQ0KDQojIGN1bXVsYXRpdmUgY291bnRzIHJlc3VsdHMgaW4gYSBsZXNzIGludGVyZXN0aW5nIGdyYXBoIA0KIyBhY2xlZCAlPiUgIA0KIyAgIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiMgICBtdXRhdGUobW9udGggPSBsdWJyaWRhdGU6Om1vbnRoKGV2ZW50X2RhdGUsIGxhYmVsID0gVFJVRSkpICU+JQ0KIyAgIGdyb3VwX2J5KG1vbnRoLCBldmVudF90eXBlKSAlPiUgDQojICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQojICAgdW5ncm91cCgpICU+JSANCiMgICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQojICAgbXV0YXRlKGN1bV9jb3VudCA9IGN1bXN1bShjb3VudCkpICU+JSANCiMgICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGN1bV9jb3VudCwgZ3JvdXAgPSBldmVudF90eXBlLCBjb2xvdXIgPSBldmVudF90eXBlKSkgKyANCiMgICBnZW9tX3Ntb290aChzZSA9IEZBTFNFKSArDQojICAgZmFjZXRfd3JhcCh+ZXZlbnRfdHlwZSwgc2NhbGVzID0gImZyZWVfeSIpICsgDQojICAgbGFicyh4ID0gIiIsDQojICAgICAgICB5ID0gIk51bWJlciBvZiBldmVudHMiLCANCiMgICAgICAgIHRpdGxlID0gIlByb2dyZXNzaW9uIG9mIDIwMjEgY29uZmxpY3QgZXZlbnRzLCBieSB0eXBlIiwNCiMgICAgICAgIHN1YnRpdGxlID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikgKyANCiMgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KQmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIHJvc2Ugc3RlYWRpbHkgdW50aWwgTWF5IDIwMjEsIHRoZW4gZXhwZXJpZW5jZWQgYSBicmllZiBkZWNsaW5lIGJlZm9yZSByaXNpbmcgYWdhaW4gaW4gU2VwdGVtYmVyIDIwMjEuIFByb3Rlc3RzIGFuZCByaW90cyBwZWFrZWQgaW4gTWFyY2ggMjAyMSwgcmlnaHQgYWZ0ZXIgdGhlIGNvdXAuIEV2ZW50cyBpbnZvbHZpbmcgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgZ3JldyBpbiBmcmVxdWVuY3kgdGhyb3VnaG91dCB0aGUgeWVhciwgdGhvdWdoIGEgc2xpZ2h0IGRlY2xpbmUgaW4gaW50ZW5zaXR5IHdhcyBub3RlZCBhdCB0aGUgZW5kIG9mIHRoZSB5ZWFyLiANCg0KPGJyPg0KDQpgYGB7ciBsaWVuLXBsb3QtZmF0YWxpdGllcywgZmlnLmhlaWdodD03fQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgoZXZlbnRfZGF0ZSwgbGFiZWwgPSBUUlVFKSkgJT4lIA0KICBncm91cF9ieShtb250aCwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGZhdGFsaXRpZXMsIGdyb3VwID0gZXZlbnRfdHlwZSwgY29sb3VyID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEyMDAsIGJ5ID0gMTAwKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIDIwMjEgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIHBlciBtb250aCwgYnkgZXZlbnQgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBjb2xvdXIgPSAiIikgDQogIA0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDMuMyBHZW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBldmVudHMNCg0KYGBge3Igc3RhdGUtZXZlbnRzLXBsb3R9DQoNCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogIG11dGF0ZShzdW0gPSBzdW0oY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShhZG1pbjEgPSBmY3RfcmVvcmRlcihhZG1pbjEsIHN1bSwgLmRlc2MgPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhZG1pbjEsIHkgPSBjb3VudCwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHN0YXQoeSksIGFjY3VyYWN5ID0gMSksIGdyb3VwID0gYWRtaW4xKSwgc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gc3VtLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDM4MDAsIGJ5ID0gMTAwMCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGhqdXN0ID0gMSwgYW5nbGUgPSA2MCksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdCBldmVudHMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpTYWdhaW5nIHNhdyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIGFzIHdlbGwgYXMgZmF0YWxpdGllcyBpbiAyMDIxLCBpbiBwYXJ0aWN1bGFyLCBpdCBleHBlcmllbmNlZCBtb3JlIHRoYW4gdGhyZWUgdGltZXMgYXMgbWFueSBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgdGhhbiB0aGUgbmV4dCBoaWdoZXN0IHJlZ2lvbiwgTWFnd2F5LiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgc2hpZnQgaW4gdGhlIHBhdHRlcm4gb2YgY29uZmxpY3QgaW4gTXlhbm1hciwgd2hpY2ggaGFzIHRyYWRpdGlvbmFsbHkgcmV2b2x2ZWQgYXJvdW5kIEthY2hpbiwgUmFraGluZSBhbmQgU2hhbi4gDQoNCjxicj4NCg0KYGBge3Igc3RhdGUtZmF0YWxpdGllcy1wbG90fQ0KDQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShzdW0gPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGFkbWluMSA9IGZjdF9yZW9yZGVyKGFkbWluMSwgc3VtLCAuZGVzYyA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFkbWluMSwgeSA9IGZhdGFsaXRpZXMsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShzdGF0KHkpLCBhY2N1cmFjeSA9IDEpLCBncm91cCA9IGFkbWluMSksIHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9IHN1bSwgdmp1c3QgPSAtMC41LCBzaXplID0gMykgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCA1MDAwLCBieSA9IDEwMDApKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBoanVzdCA9IDEsIGFuZ2xlID0gNjApLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICIyMDIxIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBieSBzdGF0ZS9yZWdpb24iLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCiANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA0LiBDb25mbGljdCBhY3RvcnMNCg0KIyMjIDQuMSBDb25mbGljdCBldmVudHMgYnkgdHlwZSBvZiBhY3RvciANCg0KVGhlIG5leHQgdHdvIHNlY3Rpb25zIHN1bW1hcmlzZSBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgZXZlbnQgdHlwZSBhbmQgYWN0b3IgdHlwZS4gRm9yIHRoZSBwbG90cyBiZWxvdywgb25lIHNob3VsZCBiZWFyIGluIG1pbmQgdGhhdCBtb3N0IGV2ZW50IHR5cGVzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgcGVhY2VmdWwgcHJvdGVzdHMpIGludm9sdmVkIG1vcmUgdGhhbiBvbmUgYWN0b3IsIHNvIHRvdGFsbGluZyB1cCBlYWNoIGZhY2V0IHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIGhpZ2hlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZXZlbnRzLiBGb3IgaW5zdGFuY2UsIHRoZSBzYW1lIGJhdHRsZSBpbnZvbHZpbmcgc3RhdGUgZm9yY2VzIGFuZCByZWJlbCBncm91cHMgd291bGQgc2hvdyB1cCBpbiB0aGUgZXZlbnQgY291bnRzIG9mIGVhY2guICANCg0KPGJyPg0KDQpgYGB7ciBhY3Rvci1mYWNldC1ldmVudC1jb3VudCwgZmlnLmhlaWdodCA9IDd9DQoNCmFjdG9ycyAlPiUNCiAgbXV0YXRlKGV2ZW50X3R5cGUgPSBmY3RfcmVsZXZlbChldmVudF90eXBlLCBjKCJCYXR0bGVzIiwgIkV4cGxvc2lvbnMvUmVtb3RlIHZpb2xlbmNlIiwgIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZXN0cyIsICJSaW90cyIsICJTdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIikpKSAlPiUgDQogIG11dGF0ZShpbnRlcjEgPSBmY3RfcmVsZXZlbChpbnRlcjEsIGMoInN0YXRlX2ZvcmNlcyIsICJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJwb2xpdGljYWxfbWlsaXRpYXMiLCAicmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlvdGVycyIsICJpZGVudGl0eV9taWxpdGlhcyIsICJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFjdG9yX3NpbXBsZSwgZXZlbnRfdHlwZSwgaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwNCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfdHlwZSkgJT4lIA0KICAjIGZpbHRlcihpbnRlcjEgIT0gImlkZW50aXR5X21pbGl0aWFzIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBjb3VudCwgeSA9IGV2ZW50X3R5cGUsIGZpbGwgPSBldmVudF90eXBlKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArDQogIGZhY2V0X3dyYXAofiBpbnRlcjEsIHNjYWxlcyA9ICJmcmVlX3giKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIA0KICAgICAgIHkgPSAiVHlwZSBvZiBjb25mbGljdCBldmVudCIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSB0eXBlIG9mIGNvbmZsaWN0IGFjdG9yIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCg0KDQpgYGANCg0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5LXRhYmxlLWV2ZW50X3R5cGV9DQphY3RvcnMgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl90eXBlID0gaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCkpICU+JSAgDQogIHRyYW5zcG9zZV9kZigpICU+JSANCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXIgPSAxKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKCJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJzdGF0ZV9mb3JjZXMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSwNCiAgICAgICAgICAgIH4gYXMubnVtZXJpYygueCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYnkgYWN0b3IgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIGRpZ2l0cyA9IDApICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjIgRmF0YWxpdGllcyBieSBhY3RvciB0eXBlDQoNClRoZSBwbG90IGJlbG93IG9uIGZhdGFsaXRpZXMgc2hvd3MgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHR5cGUgb2YgYWN0b3IuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBBQ0xFRCBkYXRhc2V0IGRvZXMgbm90IGhhdmUgYSBjb2x1bW4gdG8gYXNzaWduIGJsYW1lLCBuZWl0aGVyIGFyZSB0aGUgc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgZmF0YWxpdGllcyBhbHdheXMga25vd24gLS0gdGhlcmUgaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgY29sdW1uIGBub3Rlc2AgYW5kIHRleHQgbWluaW5nIHdvdWxkIGJlIGEgZnJ1aXRmdWwgbmV4dCBzdGVwIGZvciBmdXR1cmUgYW5hbHlzaXMsIGJ1dCBoYXMgbm90IGJlZW4gcGVyZm9ybWVkIGZvciB0aGlzIGN1cnNvcnkgb3ZlcnZpZXcgb2YgdGhlIGRhdGEuIEFuZCBzaW1pbGFyIHRvIHRoZSBwbG90IG9uIGV2ZW50IHR5cGVzIGFib3ZlLCBkdXBsaWNhdGlvbnMgaGF2ZSBiZWVuIGluY2x1ZGVkLCB0aG91Z2ggbm90IHdpdGhpbiB0aGUgdG90YWxzIGZvciBlYWNoIGFjdG9yIHR5cGUuIA0KDQpGb3IgaW5zdGFuY2UsIHVuZGVyIGZhdGFsaXRpZXMgcmVsYXRlZCB0byBwcm90ZXN0cywgYHIgZmlsdGVyKGFjdG9ycywgaW50ZXIxID09ICJwcm90ZXN0ZXJzIikgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIGZhdGFsaXRpZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGggcHJvdGVzdGVycywgd2l0aCB0aGUgbWFpbiBvdGhlciBwYXJ0eSBpbnZvbHZlZCBhbG1vc3QgZW50aXJlbHkgYmVpbmcgc3RhdGUgZm9yY2VzLCB3aXRoIHZlcnkgc21hbGwgbnVtYmVycyBiZWluZyBhc3NvY2lhdGVkIHdpdGggcmlvdGVycy4gDQoNCjxicj4NCg0KYGBge3IgYWN0b3ItZmFjZXQtZXZlbnQtZmF0YWxpdGllcywgZmlnLmhlaWdodD03fQ0KDQphY3RvcnMgJT4lDQogIG11dGF0ZShldmVudF90eXBlID0gZmN0X3JlbGV2ZWwoZXZlbnRfdHlwZSwgYygiQmF0dGxlcyIsICJFeHBsb3Npb25zL1JlbW90ZSB2aW9sZW5jZSIsICJWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdGVzdHMiLCAiUmlvdHMiLCAiU3RyYXRlZ2ljIGRldmVsb3BtZW50cyIpKSkgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUsIGV2ZW50X3R5cGUsIGludGVyMSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGV2ZW50X3R5cGUpICU+JSANCiAgZmlsdGVyKGludGVyMSAlb3V0JSBjKCJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSAlPiUgDQogIG11dGF0ZShwY190b3RhbCA9IGNvdW50IC8gc3VtKGNvdW50KSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmYXRhbGl0aWVzLCB5ID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZmFjZXRfd3JhcCh+IGludGVyMSwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIA0KICAgICAgIHkgPSAiVHlwZSBvZiBjb25mbGljdCBldmVudCIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGFjdG9yIHR5cGUiLA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgdHlwZSBvZiBjb25mbGljdCBhY3RvciIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCmBgYA0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5LXRhYmxlLWZhdGFsaXRpZXN9DQphY3RvcnMgJT4lIA0KICBtdXRhdGUoaW50ZXIxID0gZmN0X3JlbGV2ZWwoaW50ZXIxLCBjKCJzdGF0ZV9mb3JjZXMiLCAicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAicG9saXRpY2FsX21pbGl0aWFzIiwgInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpb3RlcnMiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl90eXBlID0gaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgIA0KICB0cmFuc3Bvc2VfZGYoKSAlPiUgDQogIHJvd190b19uYW1lcyhyb3dfbnVtYmVyID0gMSkgJT4lIA0KICBtdXRhdGVfYXQodmFycygicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAic3RhdGVfZm9yY2VzIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIiksDQogICAgICAgICAgICB+IGFzLm51bWVyaWMoLngpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgZGlnaXRzID0gMCkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KDQojIyMgNC4zIFdoaWNoIGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXM/DQoNCkFzIG1lbnRpb25lZCwgaXQgaXMgZGlmZmljdWx0IGF0IHRoaXMganVuY3R1cmUgdG8gc3RhdGUgaG93IG1hbnkgb2YgdGhlIGFzc29jaWF0ZWQgZmF0YWxpdGllcyB3ZXJlIHBlcnNvbnMga2lsbGVkIGJ5IHRoZXNlIGdyb3VwcyBhbmQgaG93IG1hbnkgd2VyZSBtZW1iZXJzIG9mIHRoZXNlIGdyb3VwcyBoYWQgYmVlbiB0aGUgb25lcyB3aG8gd2VyZSBraWxsZWQuIFN0aWxsLCBpdCBpcyB3b3J0aHdoaWxlIHRvIHBsb3Qgd2hpY2ggYWN0b3JzIGFyZSB0aGUgImJsb29kaWVzdCIsIGF0IGxlYXN0IGluIHJlZ2FyZHMgdG8gdGhlIG91dGNvbWVzIG9mIHRoZWlyIGFjdGlvbnMsIG9yIGhhdmUgYmVlbiBpbnZvbHZlZCBpbiBpbmNpZGVudHMgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzLiANCg0KVGhlIHBsb3QgYmVsb3cgc2Vla3MgdG8gZXhhbWluZSB3aGljaCBhY3RvcnMgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzIHBlciBldmVudCwgYW5kIG9ubHkgYWN0b3JzIHdoaWNoIGhhdmUgcGFydGljaXBhdGVkIGluIG1vcmUgdGhhbiA1MCBjb25mbGljdCBldmVudHMgaGF2ZSBiZWVuIGluY2x1ZGVkLiBUaGUgcG9pbnQgc2hvd3MgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgcGVyIGNvbmZsaWN0IGV2ZW50IGl0IHdhcyBpbnZvbHZlZCBpbi4gVGhlIHdoaXNrZXJzIHNob3cgdGhlIHVwcGVyIGFuZCBsb3dlciByYW5nZXMgb2YgZmF0YWxpdGllcyBwZXIgZXZlbnQsIHRoYXQgaXMsIDk1JSBvZiBhbGwgY29uZmxpY3QgZXZlbnRzIHRoYXQgYW4gYWN0b3IgcGFydGljaXBhdGVkIGluIGZlbGwgd2l0aGluIHRoYXQgcmFuZ2UuIFRoZSBoaWdoZXN0IG51bWJlcnMgb2YgZmF0YWxpdGllcyBwZXIgZXZlbnQgYXJlIGFzc29jaWF0ZWQgd2l0aCBwb2xpdGljYWwgbWlsaXRpYXMgYW5kIHJlYmVsIGdyb3Vwcy4gIA0KDQo8YnI+DQoNCmBgYHtyIGZhdGFsaXRpZXMtYWN0b3JzLWVycm9yYmFyaCwgZmlnLmhlaWdodD02fQ0KYWN0b3JzX2NvbmZfaW50IDwtIGFjdG9ycyAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGFkZF9jb3VudChhY3Rvcl9zaW1wbGUpICU+JSANCiAgZmlsdGVyKG4gPiA1MCkgJT4lIA0KICBuZXN0KC1hY3Rvcl9zaW1wbGUpICU+JSANCiAgbXV0YXRlKG1vZGVsID0gbWFwKGRhdGEsIH4gdC50ZXN0KC4kZmF0YWxpdGllcykpKSAlPiUgDQogIHVubmVzdF9sZWdhY3kobWFwKG1vZGVsLCB0aWR5KSkNCg0KYWN0b3JzX2NvbmZfaW50ICU+JSAgDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIHNlbGVjdChhY3Rvcl9zaW1wbGUsIGludGVyMSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAic3RhdGVfZm9yY2VzIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSBzdHJfcmVtb3ZlKGFjdG9yX3NpbXBsZSwgIlxcOi4qIiksDQogICAgICAgICBhY3Rvcl9zaW1wbGUgPSBmY3RfcmVvcmRlcihhY3Rvcl9zaW1wbGUsIGVzdGltYXRlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IGFjdG9yX3NpbXBsZSwgY29sb3VyID0gaW50ZXIxKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyANCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIHNpemUgPSAwLjUpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA3LCBieSA9IDEpKSArDQogICMgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKyANCiAgbGFicyh4ID0gIkF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIGNvbmZsaWN0IGV2ZW50IiwNCiAgICAgIHkgPSAiQ29uZmxpY3QgYWN0b3IiLCANCiAgICAgIHRpdGxlID0gIldoaWNoIGNvbmZsaWN0IGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXM/IiwgDQogICAgICBzdWJ0aXRsZSA9ICJPbmx5IGluY2x1ZGVzIGFjdG9ycyBpbnZvbHZlZCBpbiBtb3JlIHRoYW4gNTAgY29uZmxpY3QgZXZlbnRzIiwgDQogICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgIGNvbG91ciA9ICIiKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSkpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSB0YWJsZSBiZWxvdyBzdW1tYXJpc2VzIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhbmQgY29uZmxpY3QgZXZlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFyZ2VzdCBhY3RvcnMuIFRoZSB0YWJsZSBoYXMgYmVlbiBzb3J0ZWQgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBudW1iZXIgb2YgZmF0YWxpdGllczsgb25seSBhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiAxMDAgZmF0YWxpdGllcyBhcmUgc2hvd24gYW5kIGFsbCBvdGhlciBhY3RvcnMgaGF2ZSBiZWVuIGx1bXBlZCB0b2dldGhlciBhcyAiT3RoZXIiLiANCg0KYGBge3IgdGFibGUtZmF0YWxpdGllcy1zdW1tYXJ5fQ0KYWN0b3JzICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBldmVudHMgPSBuKCkpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IGlmZWxzZShmYXRhbGl0aWVzID49IDEwMCwgYWN0b3Jfc2ltcGxlLCAiT3RoZXIiKSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBldmVudHMgPSBzdW0oZXZlbnRzKSkgJT4lDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIHNlbGVjdChhY3Rvcl9zaW1wbGUsIGludGVyMSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgbXV0YXRlKGFjdG9yX3NpbXBsZSA9IHN0cl9yZW1vdmUoYWN0b3Jfc2ltcGxlLCAiXFw6LioiKSwNCiAgICAgICAgIGZhdGFsaXRpZXNfcGVyX2V2ZW50ID0gcm91bmQoZmF0YWxpdGllcyAvIGV2ZW50cywgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KGFjdG9yID0gYWN0b3Jfc2ltcGxlLCBhY3Rvcl90eXBlID0gaW50ZXIxLCBmYXRhbGl0aWVzLCBldmVudHMsIGZhdGFsaXRpZXNfcGVyX2V2ZW50KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhmYXRhbGl0aWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvcCAyMDIxIGFjdG9ycyBpbiB0ZXJtcyBvZiBmYXRhbGl0aWVzOyBhY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGxlc3MgdGhhbiAxMDAgZmF0YWxpdGllcyBoYXZlIGJlZW4gbHVtcGVkIHRvZ2V0aGVyIGFzICdPdGhlciciLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+PGJyPiANCg0KIyMjIDQuNCBTdW1tYXJ5IHRhYmxlIG9mIG1haW4gY29uZmxpY3QgYWN0b3JzDQoNCmBgYHtyIHRhYmxlLW1haW4tY29uZmxpY3QtYWN0b3JzfQ0KdG9wX2FjdG9ycyA8LSBhY3RvcnMgJT4lICANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgY291bnQoaW50ZXIxLCBhY3Rvcl9zaW1wbGUsIHNvcnQgPSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KGludGVyMSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfZ3JvdXBgID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICByZW5hbWUoZXZlbnRzID0gbiwNCiAgICAgICAgIGFjdG9yX3R5cGUgPSBpbnRlcjEsDQogICAgICAgICBhY3Rvcl9uYW1lID0gYWN0b3Jfc2ltcGxlKSAlPiUgDQogIHRvcF9uKG4gPSA1KSAlPiUgIGFycmFuZ2UoYWN0b3JfdHlwZSkNCg0Ka2FibGUodG9wX2FjdG9ycywgY2FwdGlvbiA9ICJUb3AgNSBjb25mbGljdCBhY3RvcnMgaW4gMjAyMSBieSBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBwYWNrX3Jvd3MoaW5kZXggPSB0YWJsZSh0b3BfYWN0b3JzJGFjdG9yX3R5cGUpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjUgR2VvZ3JhcGhpYyBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgYWN0b3JzDQoNCmBgYHtyIG1hcC1jb25mbGljdC1hY3RvcnMtdG93bnNoaXAsIGZpZy5oZWlnaHQ9MTB9DQphY3RvcnMgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoY29uZmxpY3RfYWN0b3JzID0gbl9kaXN0aW5jdChhY3Rvcl9zaW1wbGUpKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb25mbGljdF9hY3RvcnMpLCBzaXplID0gMC4wMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gImluZmVybm8iLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKGZpbGwgPSAibnVtYmVyIG9mXG4gY29uZmxpY3QgYWN0b3JzIiwNCiAgICAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgMjAyMSBjb25mbGljdCBhY3RvcnMgYXQgdG93bnNoaXAgbGV2ZWwiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KICANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA1LiBDb3JyZWxhdGlvbnMgYmV0d2VlbiBjb25mbGljdCBhbmQgZm9vZCBzZWN1cml0eSBjbHVzdGVyIGZvb3RwcmludCANCg0KDQojIyMgNS4xIENvcnJlbGF0aW9uIHBsb3QNCg0KYGBge3IgY29uZmxpY3Qtc2NvcmUtZGYsIHdhcm5pbmc9RkFMU0V9DQpjb25mbGljdF9kZiA8LSBhY2xlZCAlPiUgDQogICMgZG8geW91IHJlYWxseSBuZWVkIHRoaXMgc3RlcCBzaW5jZSB5b3UncmUgdXNpbmcgQmV0dGktVmVybWENCiAgbXV0YXRlKGV2ZW50X3R5cGUgPSBjYXNlX3doZW4oZXZlbnRfdHlwZSA9PSAiUHJvdGVzdHMiIH4gIlByb3Rlc3RzX2FuZF9SaW90cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGUgPT0gIlJpb3RzIiB+ICJQcm90ZXN0c19hbmRfUmlvdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGV2ZW50X3R5cGUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JQ0KICBncm91cF9ieShhZG1pbjNfcGNvZGUsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJhdHRsZXMgPSAwLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSA9IDAsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zID0gMCwNCiAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMgPSAwLCBwcm90ZXN0c19hbmRfcmlvdHMgPSAwKSkgJT4lIA0KICAjIG11dGF0ZSh0b3RhbF9ldmVudHMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKGFjbGVkICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHVuZ3JvdXAoKQ0KICANCmluZGV4X3NoYXJlcyA8LSBjb25mbGljdF9kZiAlPiUgICANCiAgbXV0YXRlX2F0KHZhcnMoYyhiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMsDQogICAgICAgICAgICAgICAgICAgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgcHJvdGVzdHNfYW5kX3Jpb3RzKSksIA0KICAgICAgICAgICBzY2FsZSkgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMoYyhiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMsDQogICAgICAgICAgICAgICAgICAgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgcHJvdGVzdHNfYW5kX3Jpb3RzKSksIA0KICAgICAgICAgICBmdW5zKCguIC0gbWluKC4sIG5hLnJtID0gVCkpLyhtYXgoLiwgbmEucm0gPSBUKSAtIG1pbiguLCBuYS5ybSA9IFQpKSkpICU+JSANCiAgbWRlcHJpdihjKCJiYXR0bGVzIiwgImV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlIiwgInZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zIiwgImZhdGFsaXRpZXMiLCAic3RyYXRlZ2ljX2RldmVsb3BtZW50cyIsICJwcm90ZXN0c19hbmRfcmlvdHMiKSwNCiAgICAgICAgICBtZXRob2QgPSAiYnYiLCBvdXRwdXQgPSAiYWxsIikNCg0KY29uZmxpY3Rfc2NvcmUgPC0gY29uZmxpY3RfZGYgJT4lIA0KICBsZWZ0X2pvaW4oaW5kZXhfc2hhcmVzJGRhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2ksDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9iYXR0bGVzID0gYmF0dGxlcywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9leHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSA9IGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgPSB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9mYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9zdHJhdGVnaWNfZGV2ZWxvcG1lbnRzID0gc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9wcm90ZXN0c19hbmRfcmlvdHMgPSBwcm90ZXN0c19hbmRfcmlvdHMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShlbnZfYmF0dGxlcyA9IGJhdHRsZXMgLyBtYXgoYmF0dGxlcyksIA0KICAgICAgICAgZW52X2V4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlID0gZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgLyBtYXgoZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UpLA0KICAgICAgICAgZW52X3Zpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zID0gdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgLyBtYXgodmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpLCANCiAgICAgICAgIGVudl9mYXRhbGl0aWVzID0gZmF0YWxpdGllcyAvIG1heChmYXRhbGl0aWVzKSwgDQogICAgICAgICBzY29yZV9lbnYgPSAoZW52X2JhdHRsZXMgKyBlbnZfZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBlbnZfdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgKyBlbnZfZmF0YWxpdGllcykgLyA0KSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbWluMSwgYWRtaW4zLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllc1t1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIl0pKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikNCg0KYGBgDQoNClRoZSBjb3JyZWxhdGlvbiBwbG90IGJlbG93IGV4YW1pbmVzIHRoZSBzcGVjaWZpYyByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGluZGl2aWR1YWwgdmFyaWFibGVzIGluIHRoZSBkYXRhc2V0IC0tIHRoZSBoaXN0b2dyYW1zIGRvd24gdGhlIGRpYWdvbmFsIHNob3cgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgdG93bnNoaXBzIGFjcm9zcyB0aGUgdmFyaW91cyB2YWx1ZXM7IHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB2YXJpYWJsZXMgKGFsbCBiZXR3ZWVuIDAgYW5kIDEpIGFyZSBzaG93biBpbiB0aGUgdXBwZXIgdHJpYW5nbGUsIHdpdGggdGhlIGFzdGVyaXNrcyBkZW5vdGluZyBob3cgc2lnbmlmaWNhbnQgdGhlIGNvcnJlbGF0aW9ucyBhcmU7IGFuZCB0aGUgbG93ZXIgdHJpYW5nbGUgc2hvd3MgdGhlIHNwZWNpZmljIGRpc3RyaWJ1dGlvbiBvZiBvYnNlcnZhdGlvbnMsIHdpdGggZWFjaCBwb2ludCByZXByZXNlbnRpbmcgZWFjaCB0b3duc2hpcC4gQmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcGxhY2VkIG9uIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gdGhhdCB0aGUgdmFyaWF0aW9uIGlzIG1vcmUgdmlzaWJsZS4gDQoNCkZvciBpbnN0YW5jZSwgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgaXMgaGlnaGx5IGNvcnJlbGF0ZWQgd2l0aCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzICh3aXRoIGEgY29lZmZpY2llbnQgb2YgMC43OSkgLS0gdGhpcyBtZWFucyB0aGF0IGluIHRoZSB0b3duc2hpcHMgd2hlcmUgc3RyYXRlZ2ljIGRldmVsb3BtZW50cyBvY2N1cnJlZCAodGhlIG1vc3QgY29tbW9uIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMgd2VyZSBhcnJlc3RzIGFuZCBsb290aW5nL3Byb3BlcnR5IGRhbWFnZSksIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFsc28gbGlrZWx5IG9jY3VycmVkLiANCg0KPGJyPg0KDQpgYGB7ciBjb3JycGxvdCwgZmlnLmhlaWdodD03LjV9DQpjb25mbGljdF9zY29yZSAlPiUgDQogIG11dGF0ZShsb2dfYmVuZWZpY2lhcmllcyA9IGxvZyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBzZWxlY3QoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBwcm90ZXN0c19hbmRfcmlvdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIA0KICAgICAgICAgZmF0YWxpdGllcywgcGFydG5lcnMsIGxvZ19iZW5lZmljaWFyaWVzKSAlPiUNCiAgcGFpcnMucGFuZWxzKHNtb290aCA9IFRSVUUsICAgICAgIyBJZiBUUlVFLCBkcmF3cyBsb2VzcyBzbW9vdGhzDQogICAgICAgICAgICAgICBzY2FsZSA9IEZBTFNFLCAgICAgICMgSWYgVFJVRSwgc2NhbGVzIHRoZSBjb3JyZWxhdGlvbiB0ZXh0IGZvbnQNCiAgICAgICAgICAgICAgIGRlbnNpdHkgPSBUUlVFLCAgICAgIyBJZiBUUlVFLCBhZGRzIGRlbnNpdHkgcGxvdHMgYW5kIGhpc3RvZ3JhbXMNCiAgICAgICAgICAgICAgIGVsbGlwc2VzID0gRkFMU0UsICAgIyBJZiBUUlVFLCBkcmF3cyBlbGxpcHNlcw0KICAgICAgICAgICAgICAgbWV0aG9kID0gInBlYXJzb24iLCAjIENvcnJlbGF0aW9uIG1ldGhvZCAoYWxzbyAic3BlYXJtYW4iIG9yICJrZW5kYWxsIikNCiAgICAgICAgICAgICAgIHBjaCA9IDgsICAgICAgICAgICAgIyBwY2ggc3ltYm9sDQogICAgICAgICAgICAgICBsbSA9IFRSVUUsICAgICAgICAgICMgSWYgVFJVRSwgcGxvdHMgbGluZWFyIGZpdCByYXRoZXIgdGhhbiB0aGUgTE9FU1MgKHNtb290aGVkKSBmaXQNCiAgICAgICAgICAgICAgIGNvciA9IFRSVUUsICAgICAgICAgIyBJZiBUUlVFLCByZXBvcnRzIGNvcnJlbGF0aW9ucw0KICAgICAgICAgICAgICAgamlnZ2xlID0gRkFMU0UsICAgICAjIElmIFRSVUUsIGRhdGEgcG9pbnRzIGFyZSBqaXR0ZXJlZA0KICAgICAgICAgICAgICAgZmFjdG9yID0gMiwgICAgICAgICAjIEppdHRlcmluZyBmYWN0b3INCiAgICAgICAgICAgICAgIGhpc3QuY29sID0gNCwgICAgICAgIyBIaXN0b2dyYW1zIGNvbG9yDQogICAgICAgICAgICAgICBzdGFycyA9IFRSVUUsICAgICAgICMgSWYgVFJVRSwgYWRkcyBzaWduaWZpY2FuY2UgbGV2ZWwgd2l0aCBzdGFycw0KICAgICAgICAgICAgICAgY2kgPSBGQUxTRSwgICAgICAgICAjIElmIFRSVUUsIGFkZHMgY29uZmlkZW5jZSBpbnRlcnZhbHMNCiAgICAgICAgICAgICAgIG1haW4gPSAiQ29ycmVsYXRpb24gcGxvdCBvZiBjb25mbGljdCBpbmRpY2F0b3JzIChhY2xlZGRhdGEuY29tKSBhbmQgRlNDIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIikNCmBgYA0KDQo8YnI+DQoNClRoZSBudW1iZXJzIG9mIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIHBlciB0b3duc2hpcCB3ZXJlLCB1bnN1cnByaXNpbmdseSwgY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIuIEhvd2V2ZXIsIHRoZSBudW1iZXIgb2YgcGFydG5lcnMgcGVyIHRvd25zaGlwcyB3YXMgb25seSBzbGlnaHRseSBjb3JyZWxhdGVkIHdpdGggdGhlIG51bWJlciBvZiBiYXR0bGVzIGFuZCB0aGUgbnVtYmVyIG9mIGV4cGxvc2lvbnMgYW5kIHJlbW90ZSB2aW9sZW5jZSAtLSB0aGlzIHBhdHRlcm4gbGlrZWx5IG9ubHkgaG9sZHMgZm9yIGNlcnRhaW4gc3RhdGVzLiBUaGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpcyBub3QgY29ycmVsYXRlZCB3aXRoIGFueSBjb25mbGljdCBpbmRpY2F0b3JzLiAgDQoNClRoZSB2YXJpb3VzIGNvbmZsaWN0IGluZGljYXRvcnMgLS0gYXMgZXhwZWN0ZWQgLS0gYXJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlciwgd2l0aCB0aGUgc3Ryb25nZXN0IHJlbGF0aW9uc2hpcCBiZWluZyBiZXR3ZWVuIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLiBGb3IgcmVmZXJlbmNlLCB0aGUgc3BlY2lmaWMgc3ViLWV2ZW50cyB1bmRlciBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIGFyZSBsaXN0ZWQgYmVsb3c6IA0KDQoNCmBgYHtyIHN0cmF0LWRldi10YWJsZX0gDQphY2xlZCAlPiUgIGZpbHRlcih5ZWFyID09IDIwMjEgJiBldmVudF90eXBlID09ICJTdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIikgJT4lIA0KICBjb3VudChzdWJfZXZlbnRfdHlwZSwgc29ydCA9IFRSVUUsIG5hbWUgPSAiY291bnQiKSAlPiUgDQogIG11dGF0ZShwZXJjZW50YWdlID0gcm91bmQoY291bnQgLyBzdW0oY291bnQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlN1Yi1ldmVudCB0eXBlcyB1bmRlciBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLCAyMDIxIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjIgUmV2aXNpdGluZyB0aGUgTUlNVS1IQVJQIGNvbmZsaWN0IGluZGV4DQoNCkEgY29uZmxpY3Qgc2NvcmUgd2FzIHRoZW4gY2FsY3VsYXRlZCB1c2luZyBBQ0xFRCBkYXRhOiBpdHMgY29uc3RydWN0aW9uIHdhcyBzaW1pbGFyIHRvIHRoZSBjb25mbGljdCBpbmRleCBpbiB0aGUgTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXMsIHdpdGggdGhlIG5vdGFibGUgb21pc3Npb24gb2YgZGF0YSBvbiBkaXNwbGFjZW1lbnQgLS0gdGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIHRoZSBzY29yZSB3aWxsIGJlIHVwZGF0ZWQgb25jZSB0aGF0IGRhdGEgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUuDQoNClRoZSBjb25mbGljdCBzY29yZSAtLSBhdCBpdHMgbW9zdCBiYXNpYyBsZXZlbCAtLSBpcyBhbiBhdmVyYWdlIG9mIHRoZSBub3JtYWxpc2VkIHZhbHVlcyBvZiBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zLCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzIGFuZCB0aGUgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzLiBIb3dldmVyLCB0aGVzZSBub3JtYWxpc2VkIHZhbHVlcyBoYXZlIGJlIHJlLXdlaWdodGVkIHdpdGggdGhlIEJldHRpLVZlcm1hIG1ldGhvZCwgd2hpY2ggcGVuYWxpc2VzIHJlZHVuZGFuY3kgYW5kIHJld2FyZHMgdmFyaWF0aW9uOyB0aGlzIGlzIHRoZSBvdGhlciBub3RhYmxlIGRpdmVyZ2VuY2UgZnJvbSBNSU1VLUhBUlAncyBtZXRob2RvbG9neS4gVGhlIEJldHRpLVZlcm1hIG1ldGhvZCB3YXMgZW1wbG95ZWQgdGhyb3VnaCB0aGUgYG1kZXByaXZgIFIgcGFja2FnZSBkZXZlbG9wZWQgYnkgQXRpbGxpbyBCZW5pbmkgYW5kIEFsZG8gQmVuaW5pLiANCg0KQmVsb3cgaXMgYSBwbG90IG9mIHRvd25zaGlwcyBjb21wYXJpbmcgdGhlIGNvbmZsaWN0IHNjb3JlIHdpdGggdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzLiANCg0KPGJyPg0KDQpgYGB7ciBzY29yZS1pLWJlbi1wbG90fQ0KIyB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb25mbGljdCBzY29yZSBhbmQgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9yIG51bWJlciBvZiBwYXJ0bmVycyBwZXIgdG93bnNoaXANCmNvbmZsaWN0X3Njb3JlICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gc2NvcmVfaSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgeSA9ICJDb25mbGljdCBzY29yZSIsIA0KICAgICAgIHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgY29uZmxpY3Qgc2NvcmUgYXQgdG93bnNoaXAgbGV2ZWwiLA0KICAgICAgIHN1YnRpdGxlID0gIkhpZ2hlciBjb25mbGljdCBzY29yZXMgaW5kaWNhdGUgbW9yZSBjb25mbGljdCBldmVudHMgYW5mIGZhdGFsaXRpZXMiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlczogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSBhbmQgRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KPGJyPg0KQXMgZXhwZWN0ZWQsIGZyb20gcmV2aWV3aW5nIHRoZSBjb3JyZWxhdGlvbiBwbG90IGFib3ZlIGFuZCBmcm9tIHRoZSBmbGF0IGJsdWUgbGluZSwgdGhlIGluY2lkZW5jZSBvZiBjb25mbGljdCAocmVwcmVzZW50ZWQgYnkgdGhlIGNvbmZsaWN0IHNjb3JlLCB3aGVyZSBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciBpbmNpZGVuY2Ugb2YgY29uZmxpY3QpIGhhcyBubyBkaXNjZXJuaWJsZSByZWxhdGlvbnNoaXAgLS0gcG9zaXRpdmUgb3IgbmVnYXRpdmUgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIEZTQyBiZW5lZmljaWFyaWVzLiBUaGUgYmx1ZSBsaW5lIGp1c3Qgc2hvd3MgYSBzaW1wbGUgbGluZWFyIG1vZGVsLCB0aGUgc3VtbWFyeSBvZiB3aGljaCBpcyBwcmludGVkIGJlbG93Og0KDQo8YnI+DQoNCmBgYHtyIGxtLW91dHB1dH0NCmNvbmZsaWN0X3Njb3JlICU+JQ0KICByZW5hbWUoY29uZmxpY3Rfc2NvcmUgPSBzY29yZV9pKSAlPiUgDQogIGxtKGNvbmZsaWN0X3Njb3JlIH4gYmVuZWZpY2lhcmllcyArIHBhcnRuZXJzLCBkYXRhID0gLikgJT4lIA0KICBzdW1tYXJ5KCkgJT4lIHBhbmRlcihjYXB0aW9uID0gIlN1bW1hcnkgb2YgbGluZWFyIG1vZGVsIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNS4zIFRvd25zaGlwLWxldmVsIGRpc3RyaWJ1dGlvbnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzDQoNClRoZXNlIHR3byBoaXN0b2dyYW1zIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIHBlciB0b3duc2hpcC4gQWRkaXRpb25hbCBhbmFseXNpcyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBhIGxhdGVyIGRhdGUuIEhvd2V2ZXIsIHRvd25zaGlwcyB3aXRoIG1vcmUgdGhhbiAxMDAgY29uZmxpY3QgZXZlbnRzIHNob3VsZCBiZSBjb25zaWRlcmVkIHByaW9yaXRpZXMgZm9yIGh1bWFuaXRhcmlhbiBhY3Rpb24uIE1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBpbiBjaGFwdGVyIDguICANCg0KPGJyPg0KDQpgYGB7ciBoaXN0b2dyYW0tY29uZmxpY3QtZXZlbnRzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3RzIikgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIGFkbWluMykgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZXZlbnRzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBldmVudHMpKSArIA0KICBnZW9tX2hpc3RvZ3JhbSgpICsgDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW0gb2YgY29uZmxpY3QgZXZlbnRzIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJQZWFjZWZ1bCBwcm90ZXN0cyBoYXZlIGJlZW4gZXhjbHVkZWQiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKSArIA0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KICANCmBgYA0KDQo8YnI+DQoNClNpbWlsYXIgdG8gdGhlIHBsb3QgYWJvdmUgb24gY29uZmxpY3QgZXZlbnRzLCB0aGVyZSBhcmUgc29tZSB2ZXJ5IGNsZWFyIG91dGxpZXJzIGluIHRlcm1zIG9mIGZhdGFsaXRpZXMuIEl0IHdvdWxkIGFsc28gYmUgaW1wb3J0YW50IHRvIGVzdGFibGlzaCB0aHJlc2hvbGRzICh3aXRoIHRoZSBjb25mbGljdCBzY29yZSBvciBhbnkgb2YgaXRzIGNvbnN0aXR1ZW50IGNvbXBvbmVudHMpIGFuZCB0YXJnZXQgaGVhdmlseS1hZmZlY3RlZCBhcmVhcyBmb3IgaHVtYW5pdGFyaWFuIGludGVydmVudGlvbiAtLSBhdCBsZWFzdCwgYWxsIHRvd25zaGlwcyB3aXRoIG1vcmUgdGhhbiAxMDAgY29uZmxpY3QgZmF0YWxpdGllcyBzaG91bGQgYmUgcHJpb3JpdGlzZWQuIA0KDQo8YnI+DQoNCmBgYHtyIGhpc3RvZ3JhbS1mYXRhbGl0aWVzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgYWRtaW4zKSAlPiUgDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhldmVudHMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZhdGFsaXRpZXMpKSArIA0KICBnZW9tX2hpc3RvZ3JhbSgpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAwLCBieSA9IDEwMCkpICsgDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW0gb2YgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyA2LiBUZXh0IG1pbmluZyB0aGUgQUNMRUQgZGF0YXNldA0KDQojIyMgNi4xIE5ldHdvcmsgZ3JhcGggb2YgY29ycmVsYXRlZCB3b3Jkcw0KDQpUaGlzIGNoYXB0ZXIgZm9jdXNlcyBvbiBkYXRhIG1pbmluZyB0aGUgdGV4dCB3aXRoaW4gdGhlIGNvbHVtbiBgbm90ZXNgIG9mIHRoZSBBQ0xFRCBkYXRhc2V0LCB3aGljaCBjb250YWlucyB0aGUgZGVzY3JpcHRpb25zIG9mIGVhY2ggY29uZmxpY3QgZXZlbnRzLiBGb3IgdGhpcyBmaXJzdCBzZWN0aW9uLCBpdCBpcyBvZiBpbnRlcmVzdCB0byB0aGUgRlNDIHRvIHZpc3VhbGlzZSBhbGwgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmdzdCB3b3JkIHNpbXVsdGFuZW91c2x5IGFuZCBoYXZlIGFycmFuZ2VkIHRoZXNlIHdvcmRzIGludG8gYSBuZXR3b3JrIGdyYXBoLiBCZWxvdywgZWFjaCB3b3JkIGZyb20gdGhlIGNvbmZsaWN0IGRlc2NyaXB0aW9uIGlzIGEgbm9kZSBhbmQgdGhlIG9wYWNpdHkgb2YgdGhlIGxpbmUgZGVub3RlcyB0aGUgc3RyZW5ndGggb2YgaXRzIGNvcnJlbGF0aW9uIHRvIG90aGVyIHdvcmRzICh0aGF0IGlzLCB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGV5IGhhdmUgYmVlbiB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzYW1lIGNvbmZsaWN0IGV2ZW50KTogDQoNCjxicj4NCg0KWyFbY29uZmxpY3QgbmV0d29yayBncmFwaF0oY29uZmxpY3RfbmV0d29ya19ncmFwaC5wbmcpXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIvZXhwbG9yYXRvcnktZGF0YS1hbmFseXNpcy1hY2xlZC1mc2MvbWFzdGVyL2NvbmZsaWN0X25ldHdvcmtfbWFwLnBuZyl7dGFyZ2V0PSJfYmxhbmsifQ0KY2xpY2sgKipbaGVyZV0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjL21hc3Rlci9jb25mbGljdF9uZXR3b3JrX21hcC5wbmcpe3RhcmdldD0iX2JsYW5rIn0qKiB0byBzZWUgdGhlIGZ1bGwtc2l6ZWQgZ3JhcGguIA0KDQo8YnI+DQoNClNldmVyYWwgaW50ZXJlc3RpbmcgY2x1c3RlcnMgYXJlIG5vdGljZWQ6IHRoZSBmaXJzdCBvZiB3aGljaCBjbHVzdGVycyBhcm91bmQgKnByb3Rlc3RzKiBhbmQgaXMgbGlua2VkIHRvIHdvcmRzIHN1Y2ggYXMgKmNvdXAqIGFuZCAqZGlzb2JlZGllbmNlKiwgYmVsb3cgaXQgaXMgYW5vdGhlciBjbG9zZWx5IHJlbGF0ZWQgY2x1c3RlciBjb250YWluaW5nIHRoZSB3b3JkcyAqbGl2ZSosICpydWJiZXIqLCAqYnVsbGV0cyosICpkaXNwZXJzZSogYW5kICpjcm93ZCouIEl0IGNhbiBiZSBmYWlybHkgZWFzaWx5IHN1cm1pc2VkIHRoYXQgdGhlc2Ugd29yZHMgYXJlIHJlbGF0ZWQgdG8gY29uZmxpY3QgZXZlbnRzIHN1cnJvdW5kaW5nIHRoZSBGZWJydWFyeSAyMDIxIGNvdXAgYW5kIHRoZSBtYXNzIGRlbW9uc3RyYXRpb25zIGluIHJlc3BvbnNlIHRvIGl0IC0tIHRoZSB3b3JkICpGZWJydWFyeSogaXMgYWxzbyBjbG9zZWx5IGxpbmtlZCB3aXRoIHRoZXNlIGNsdXN0ZXJzLiANCg0KQW5vdGhlciBjbHVzdGVyIG9mIG5vdGUgY2VudHJlcyBhcm91bmQgdGhlIHdvcmRzICpyZW1vdGUqLCAqY29udHJvbGxlZCogYW5kICpleHBsb3NpdmVzKiwgYW5kIGlzIGNsb3NlbHkgbGlua2VkIHRvIHRoZSB3b3JkcyAqY29udm95KiwgKnRydWNrcyogYW5kICpsYW5kbWluZXMqIC0tLSB0aGVzZSB3b3JkcyBhcmUgbGlrZWx5IGxpbmtlZCB0byBldmVudHMgd2hlcmUgbWlsaXRhcnkgY29udm95cyB3ZXJlIGJvbWJlZCBhbmQgYW1idXNoZWQgYnkgUGVvcGxlJ3MgRGVmZW5jZSBGb3JjZXMuIA0KDQpUaGVyZSBpcyBhbHNvIHRoZSBLYWNoaW4gY2x1c3RlciwgY2VudHJlZCBhcm91bmQgKk15aXRreWluYSosICpXYWluZ21hdyosICpNb25oeWluKiwgKkhwYWthbnQqLCAqQmhhbW8qIGFuZCB0aGUgKktJQSosIHRoZSBLYWNoaW4gSW5kZXBlbmRlbmNlIEFybXkuIE5vdGljZWFibHksIHRoaXMgY2x1c3RlciBhbHNvIGhhcyBsaW5rcyB3aXRoIHRoZSB3b3JkcyAqYmF0dGFsaW9uKiBhbmQgKmpldCogYW5kICpmaWdodGVycyouIA0KDQpUaGlzIG5ldHdvcmsgZ3JhcGggaXMgbm90IGludGVuZGVkIHRvIGJlIGFuIGV4aGF1c3RpdmUgcmVjb3JkIG9mIHRoZSBjb25mbGljdCBldmVudHMgaW4gMjAyMSBhbmQgbWVyZWx5IGludGVuZHMgdG8gcHJvdmlkZSBhbiBvdmVydmlldzogaW5kZWVkLCBvbmx5IHdvcmRzIHdoaWNoIGFwcGVhcmVkIG1vcmUgdGhhbiA3MCB0aW1lcyBpbiB0aGUgQUNMRUQgZGF0YXNldCBhbmQgaGFkIGEgY29ycmVsYXRpb24gb2YgMC4yIG9yIG1vcmUgd2VyZSBpbmNsdWRlZC4gVGhlc2UgdGhyZXNob2xkcyB3ZXJlIGNob3NlbiB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgZ3JhcGgsIGJ1dCB0aGUgaW5jbHVzaW9uIG9mIHdvcmRzIHdpdGggdG9vIGZldyBvY2N1cnJlbmNlcyBtaWdodCBhbHNvIHRvIHNwdXJpb3VzIGNvcnJlbGF0aW9ucy4gQ2xpY2sgb24gdGhlIGxpbmsgdG8gc2VlIHRoZSBncmFwaCBhdCBmdWxsLXNpemUgYW5kIGV4cGxvcmUgaXQgZnVydGhlci4gDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgUGFpcndpc2UgY29ycmVsYXRpb25zIA0KDQpUbyBjb21wbGVtZW50IHRoZSBuZXR3b3JrIGdyYXBoIGFib3ZlLCB0aGUgdGFibGUgYmVsb3cgc2hvd3MgY29ycmVsYXRpb25zIGJldHdlZW4gaW5kaXZpZHVhbCB3b3JkcyBpbiB0aGUgQUNMRUQgZGF0YXNldCBjb25mbGljdCBkZXNjcmlwdGlvbnMgLS0gdGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB0aGVyZSBpcyBhIHdvcmQgb2YgaW50ZXJlc3QgdGhhdCB0aGUgcmVhZGVyIHdvdWxkIGxpa2UgdG8gZXhwbG9yZSBpbiBmdXJ0aGVyIGRldGFpbC4gVG8gcmVkdWNlIHRoZSBzaXplIG9mIHRhYmxlIGxvYWRlZCwgb25seSB3b3JkcyB3aGljaCBoYXZlIGFwcGVhcmVkIG1vcmUgdGhhbiA1MCB0aW1lcyBpbiAyMDIxIGFuZCBvbmx5IHRoZSB0b3AgMjAgbWF0Y2hlcyBwZXIgd29yZCBoYXZlIGJlZW4gaW5jbHVkZWQuIEEgY29ycmVsYXRpb24gb2YgMSBtZWFucyB0aGF0IHRoZSB3b3JkIGFsd2F5cyBhcHBlYXJzIHdpdGggaXRzIG1hdGNoIGluIHRoZSBkYXRhc2V0OyBhIGNvcnJlbGF0aW9uIG9mIDAuNSBtZWFucyB0aGF0IHRoZSB3b3JkIGFwcGVhcnMgaW4gdGhlIHNhbWUgZXZlbnQgYXMgaXRzIG1hdGNoIDUwJSBvZiB0aGUgdGltZS4gDQoNClVzZSB0aGUgZmlsdGVyIGFib3ZlIHRoZSBjb2x1bW4gKipgd29yZGAqKiB0byB0cnkgb3V0IGRpZmZlcmVudCB3b3JkcyAtLSB0cnkgc3RhcnRpbmcgd2l0aCAiYXJ0aWxsZXJ5IiwgInByb3Rlc3QiLCAibGFuZG1pbmUiIG9yIGEgbG9jYXRpb24gb2YgaW50ZXJlc3QuIEFsbCB3b3JkcyBhcmUgaW4gbG93ZXIgY2FzZS4gVGhlIHNlYXJjaCBiYXIgd2lsbCBsb29rIGluIGJvdGggY29sdW1ucyBhbmQgbWF5IHByb3ZlIGxlc3MgdXNlZnVsIHRoYW4gdGhlIGZpbHRlciBiYXIuIA0KDQo8YnI+DQoNCmBgYHtyIGR0LXBhaXJ3aXNlLXdvcmRzfQ0KYWNsZWRfd29yZHMgJT4lICANCiAgZmlsdGVyKHdvcmQgJW91dCUgYygidG93bnNoaXAiLCAiZGlzdHJpY3QiLCAibXlhbm1hciIsICJyZWdpb24iLCAidmlsbGFnZSIsICJ0b3duIiwgInNpemUiLCAicmVwb3J0IiwgImNvZGUiLCAiY29kZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJkdmIiLCAiYWFwcCIsICJyZmEiLCAiaXJyYXdhZGR5IikpICU+JSANCiAgZGlzdGluY3QoZGF0YV9pZCwgd29yZCkgJT4lIA0KICBhZGRfY291bnQod29yZCkgJT4lIA0KICBmaWx0ZXIobiA+PSA1MCkgJT4lIA0KICBwYWlyd2lzZV9jb3Iod29yZCwgZGF0YV9pZCwgc29ydCA9IFRSVUUpICU+JQ0KICByZW5hbWUod29yZCA9IGl0ZW0xLCBtYXRjaCA9IGl0ZW0yKSAlPiUgDQogIGdyb3VwX2J5KHdvcmQpICU+JSANCiAgdG9wX24oY29ycmVsYXRpb24sIG4gPSAyMCkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwgDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoID0gbGlzdChyZWdleCA9IFRSVUUpDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICMgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICMgICAgICAgIHBhc3RlMCgiJCh0aGlzLmFwaSgpLnRhYmxlKCkuY29udGFpbmVyKCkpLmNzcyh7J2ZvbnQtc2l6ZSc6ICciLCAiOC41cHQiLCAiJ30pOyIpLA0KICAjICAgICAgICAifSIpDQogICAgICAgKSwNCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFpcndpc2UgY29ycmVsYXRpb25zIGluIGNvbmZsaWN0IGV2ZW50IGRlc2NyaXB0aW9ucyIpDQogICAgICkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJjb3JyZWxhdGlvbiIpLCBkaWdpdHMgPSAzKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDYuMyBTb3VyY2VzIHVzZWQgYnkgdGhlIEFDTEVEIGRhdGFzZXQNCg0KDQpgYGB7ciBzb3VyY2VzLWRmfQ0KDQphY2xlZF9zb3VyY2UgPC0gYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIHNlcGFyYXRlKHNvdXJjZSwgc2VwID0gIjsgIiwgaW50byA9IHBhc3RlKCJ2IiwgMTo0LCBzZXAgPSAiXyIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyh2XzE6dl80KSwgbmFtZXNfdG8gPSAiaWdub3JlIiwgdmFsdWVzX3RvID0gInNvdXJjZV9sb25nIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNvdXJjZV9sb25nKSkNCg0KYGBgDQoNCkFzIG1lbnRpb25lZCwgdGhlc2Ugd29yZHMgb3JpZ2luYXRlIGZyb20gdGhlIEFDTEVEIGRhdGFzZXQncyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBjb25mbGljdCBldmVudC4gSW4gdGhlIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMsIHRoZXNlIGNvbmZsaWN0IGRlc2NyaXB0aW9ucyBhcmUgYXJ0aWNsZXMgZnJvbSB2YXJpb3VzIG5ld3Mgc291cmNlcy4gDQoNCkEgdG90YWwgb2YgYHIgYWNsZWRfc291cmNlICU+JSBkaXN0aW5jdChzb3VyY2VfbG9uZykgJT4lIG5yb3dgIG5ld3Mgc291cmNlcyB3ZXJlIHVzZWQgaW4gdGhlIEFDTEVEIGRhdGFzZXQuIEFib3V0IGEgdGhpcmQgb2YgdGhlIGNvbmZsaWN0IGV2ZW50cyBpbiAyMDIxIGluY2x1ZGVkIGluIHRoZSBBQ0xFRCBkYXRhc2V0IHdlcmUgb3JpZ2luYWxseSByZXBvcnRlZCBpbiB0aGUgW0RlbW9jcmF0aWMgVm9pY2Ugb2YgQnVybWFdKGh0dHBzOi8vZW5nbGlzaC5kdmIubm8vKS4gVG8gYXNzZXNzIHRoZSBjb21wbGV0ZW5lc3MgYW5kIHJlbGlhYmlsaXR5IG9mIHRoZSBBQ0xFRCBkYXRhc2V0LCBhIG1vcmUgdGhvcm91Z2ggYW5hbHlzaXMgb2YgdGhlIG5ld3Mgc291cmNlcyBpdCBtYWtlcyB1c2Ugb2Ygc2hvdWxkIGJlIGNvbmR1Y3RlZC4gQWRkaXRpb25hbGx5LCBjb21wYXJpc29ucyBzaG91bGQgYmUgbWFkZSBiZXR3ZWVuIEFDTEVEJ3MgbWV0aG9kb2xvZ3kgYW5kIHRoYXQgb2YgdGhlIE5leHVzIFJlc3BvbnNlIE1lY2hhbmlzbS4gVGhlIG1vc3QgY29tbW9uIG5ld3Mgc291cmNlcyBhcmUgbGlzdGVkIGluIHRoZSBwbG90IGJlbG93LCBpbiBvcmRlciBvZiB0aGUgc2hhcmUgb2YgMjAyMSBjb25mbGljdCBldmVudHMgYXR0cmlidXRlZCB0byB0aGVtLiANCg0KPGJyPg0KDQpgYGB7ciBzb3VyY2VzLWJhcnBsb3R9DQoNCmFjbGVkX3NvdXJjZSAlPiUgDQogIG11dGF0ZShzb3VyY2VfbG9uZyA9IGZjdF9sdW1wKHNvdXJjZV9sb25nICU+JSBhcy5mYWN0b3IsIG49MjApKSAlPiUgDQogIGNvdW50KHNvdXJjZV9sb25nLCBzb3J0ID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoc291cmNlX2xvbmcgPSBmY3RfcmVvcmRlcihzb3VyY2VfbG9uZywgbiksIA0KICAgICAgICAgcGNfb2ZfdG90YWwgPSBuIC8gc3VtKG4pKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX29mX3RvdGFsLCB5ID0gc291cmNlX2xvbmcsIGZpbGwgPSBzb3VyY2VfbG9uZykpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgYnJlYWtzID0gc2VxKDAsIDAuMzgsIGJ5ID0gMC4wNSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIA0KICBsYWJzKHggPSAiUGVyY2VudGFnZSBvZiBjb25mbGljdCBldmVudHMgcmVwb3J0ZWQgYnkgc291cmNlIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJNb3N0IGNvbW1vbiBkYXRhIHNvdXJjZXMgaW4gMjAyMSBpbiB0aGUgQUNMRUQgZGF0YXNldCIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZXMgb3V0c2lkZSBvZiB0aGUgdG9wIDIwIHdlcmUgcmVjb2RlZCBhcyAnT3RoZXInIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQogICAgICAgIA0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDcuIE5leHQgc3RlcHMNCg0KKiBSZS1jYWxjdWxhdGUgdGhlIGNvbmZsaWN0IHNjb3JlIG9uY2UgSURQIGRhdGEgaXMgb2J0YWluZWQgYW5kIGNvbXBhcmUgdGhlc2UgcmVzdWx0cyB0byBwcmV2aW91cyByZXN1bHRzIHJlY29yZGVkIGJ5IE1JTVUtSEFSUCBpbiB0aGVpciB2dWxuZXJhYmlsaXR5IGFuYWx5c2lzLiBUbyBub3RlLCBkaXNwbGFjZW1lbnQgaXMgbGlrZWx5IHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggdGhlIG90aGVyIGNvbmZsaWN0IGluZGljYXRvcnMgKHRoaXMgd2FzIHRoZSBjYXNlIHdpdGggdGhlIE1JTVUtSEFSUCBjb25mbGljdCBpbmRleCkuIE5ldmVydGhlbGVzcywgaXQgd2FzIGEga2V5IGNvbXBvbmVudCBvZiB0aGUgTUlNVS1IQVJQIG1vZGVsIGFuZCBpdHMgaW5jbHVzaW9uIHdpbGwgYWlkIGluIGltcHJvdmluZyBjb21wYXJhYmlsaXR5LiANCg0KKiBDb21wYXJlIHRoZSBjb25mbGljdCBzY29yZSBhbmQgc3BlY2lmaWMgY29uZmxpY3QgaW5kaWNhdG9ycyB0byByZXN1bHRzIG9mIHRoZSBXRlAtRkFPIGZvb2QgaW5zZWN1cml0eSBzdXJ2ZXkuIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGlmIHRoZXJlIGFyZSBhbnkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHR3by4gRmlsdGVyIHRoZSBjb25mbGljdCBkYXRhIHRvIG9ubHkgaW5jbHVkZSB0aW1lIHBlcmlvZHMgcmVsZXZhbnQgdG8gV0ZQLUZBTydzIHN0dWR5LiBBZGRpdGlvbmFsbHksIGNvbmZsaWN0IHNjb3JlcyBzaG91bGQgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIG1hcmtldCBwcmljZXMgdG8gc2VlIGlmIGEgcHJlZGljdGl2ZSBtb2RlbCBjYW4gYmUgZXN0YWJsaXNoZWQuIEFkZGl0aW9uYWxseSwgYmVnaW4gdGhlIGNvbXBhcmlzb24gb2YgY29uZmxpY3QgZGF0YSBhbmQgZGF0YSBvbiBtYWxudXRyaXRpb24uIFRoZXJlIHdpbGwgbGlrZWx5IGJlIG1hbnkgY2hhbGxlbmdlcyBpbiBvYnRhaW5pbmcgYWNjdXJhdGUgbW9ydGFsaXR5IHJhdGVzIG9mIGFueSBraW5kLiANCg0KKiBDb21wYXJlIGNvbmZsaWN0IGluZGljYXRvcnMgdG8gbWFya2V0IHByaWNlcyB0byBpZGVudGlmeSBpZiBiYXR0bGVzIGFuZCBvdGhlciB2aW9sZW50IGluY2lkZW50cyBoYXZlIGhhZCBpbXBhY3RzIG9uIGZvb2QgcHJpY2VzIGFuZCB0aGVpciBzdGFiaWxpdHk7IGV4cGxvcmUgaWYgYSBwcmVkaWN0aXZlIG1vZGVsIGNhbiBiZSBkZXZlbG9wZWQuIA0KDQoqIFJldmlldyBmaW5kaW5ncyB3aXRoIG90aGVyIGh1bWFuaXRhcmlhbiBzdGFrZWhvbGRlcnM7IGRldmVsb3AgYXJlYS1zcGVjaWZpYyBwcm9kdWN0cywgaWYgbmVjZXNzYXJ5LiBJdCBpcyBpbXBvcnRhbnQgdG8gcmV2aWV3IHRoZSBjb25mbGljdCBzY29yZSB3aXRoIG90aGVyIHN0YWtlaG9sZGVycyB0byBhc3Nlc3MgYXBwZXRpdGUgZm9yIGl0cyBhZG9wdGlvbi4gTW9zdCBvZiB0aGUgZGF0YSB1c2VkIGZvciBpdHMgZ2VuZXJhdGlvbiBpcyBlYXNpbHkgYWNjZXNzaWJsZSBhbmQgcmVndWxhcmx5IHVwZGF0ZWQsIHRob3VnaCBpdCByZW1haW5zIHRvIGJlIHNlZW4gdG8gd2hhdCBleHRlbnQgdGhpcyBpcyB0cnVlIGZvciB0aGUgZGF0YSBvbiBkaXNwbGFjZW1lbnQuIA0KDQoqIENvbXBhcmUgQUNMRUQgZGF0YSBhZ2FpbnN0IE1JTVUncyBoYXJkLXRvLXJlYWNoIGFyZWFzIGRhdGFzZXQuIA0KDQoqIENyb3NzLXJlZmVyZW5jZSBjb25mbGljdCBkYXRhIHdpdGggcGFydG5lciBwcmVzZW5jZSBhbmQgYWNoaWV2ZW1lbnRzIG9mIG90aGVyIGNsdXN0ZXJzLiANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgOC4gUmVmZXJlbmNlIG1hcHMgYW5kIHRhYmxlcw0KDQoNCiMjIyA4LjEgUmVmZXJlbmNlIHRhYmxlIG9mIDIwMjEgY29uZmxpY3QgZXZlbnRzIGFnZ3JlZ2F0ZWQgYXQgdG93bnNoaXAgbGV2ZWwgDQoNCmBgYHtyIERULWJ5LXRvd25zaGlwfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgYWRtaW4zLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgY291bnQoZXZlbnRfdHlwZSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBuKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gcm93U3VtcyhhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkgJT4lICANCiAgbGVmdF9qb2luKGFjbGVkICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgbGVmdF9qb2luKGZzYyAlPiUgIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bSh1X2JlbikpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChwYXJ0bmVycyA9IDAsIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUgPSBhZG1pbjEsIHRvd25zaGlwID0gYWRtaW4zLCB0b3RhbF9ldmVudHMsIGZhdGFsaXRpZXMsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlID0gZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzLA0KICAgICAgICAgc3RyYXRlZ2ljX2RldiA9IHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHZpb2xlbmNlX2NpdmlsaWFucyA9IHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCByaW90cywgcGFydG5lcnMsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcywgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9ldmVudHMpKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAgImZ1bmN0aW9uKHNldHRpbmdzLCBqc29uKSB7IiwNCiAgICAgICAgICBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICAifSIpKSwNCiAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTQwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIxIGNvbmZsaWN0IGV2ZW50cyBieSB0b3duc2hpcCIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImJlbmVmaWNpYXJpZXMiKSwgZGlnaXRzID0gMCkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA4LjIgUmVmZXJlbmNlIHRhYmxlIGJ5IGNvbmZsaWN0IGFjdG9ycyBpbiAyMDIxDQoNCmBgYHtyIERULWNvbmZsaWN0LWFjdG9yc30NCmFjdG9ycyAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBhY3Rvcl90eXBlID0gaW50ZXIxLCBldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGV2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gY291bnQpICU+JSAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4oYWN0b3JzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhY3Rvcl9zaW1wbGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpLCBieSA9ICJhY3Rvcl9zaW1wbGUiKSAlPiUNCiAgcmVuYW1lKGFjdG9yX25hbWUgPSBhY3Rvcl9zaW1wbGUpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlID0gMCwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgPSAwLCBiYXR0bGVzID0gMCwgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyA9IDAsIA0KICAgICAgICAgICAgICAgICAgcmlvdHMgPSAwLCBwcm90ZXN0cyA9IDApKSAlPiUNCiAgc2VsZWN0KGFjdG9yX25hbWUsIGFjdG9yX3R5cGUsIHRvd25zaGlwcywgZmF0YWxpdGllcywgdG90YWxfZXZlbnRzLCBiYXR0bGVzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHJpb3RzLA0KICAgICAgICAgcHJvdGVzdHMsIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2V2ZW50cykpICU+JQ0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICAgICAgICAgcGFzdGUwKCIkKHRoaXMuYXBpKCkudGFibGUoKS5jb250YWluZXIoKSkuY3NzKHsnZm9udC1zaXplJzogJyIsICI4LjVwdCIsICInfSk7IiksDQogICAgICAgICAgIn0iKSksDQogICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMSBjb25mbGljdCBhY3RvcnMiKSkgJT4lDQogIGZvcm1hdFJvdW5kKGMoImZhdGFsaXRpZXMiLCAidG90YWxfZXZlbnRzIiwgImJhdHRsZXMiLCAidmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMiLCAiZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UiLCANCiAgICAgICAgICAgICAgICAicHJvdGVzdHMiLCAic3RyYXRlZ2ljX2RldmVsb3BtZW50cyIpLCBkaWdpdHMgPSAwKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgOC4zIFJlZmVyZW5jZSBtYXBzDQoNCmBgYHtyIHBhdGNod29yay1tYXBzLCBmaWcuaGVpZ2h0PTE2fSANCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdHMiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KICBmdWxsX2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb3VudCksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGJ5IHRvd25zaGlwIDIwMjEiLA0KICAgICAgIHN1YnRpdGxlID0gIlBlYWNlZnVsIHByb3Rlc3RzIGhhdmUgYmVlbiBleGNsdWRlZCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgIGZpbGwgPSAiY29uZmxpY3QgZXZlbnRzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkgKw0KICANCmZzYyAlPiUNCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUNCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IDAuMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgYnJlYWtzID0gYygxLCAzLCA2LCA5LCAxMikpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgaW4gMjAyMSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5wYXJ0bmVycyIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuMikpICsgDQogIA0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgbmFfaWYoMCkgJT4lIA0KICBmdWxsX2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBmYXRhbGl0aWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJDb25mbGljdCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwIDIwMjEiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gImZhdGFsaXRpZXMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKSArDQogIA0KZnNjICU+JQ0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh1X2JlbiksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJlZ2luID0gMC4yLCB0cmFucyA9ICJsb2cxMCIpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZvb2Qgc2VjdXJpdHkgYmVuZWZpY2lhcmllcyBpbiAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIsDQogICAgICAgZmlsbCA9ICJudW1iZXIgb2ZcbmJlbmVmaWNpYXJpZXMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKQ0KDQpgYGANCg0KDQoNCg==